在 R 中的点阵图例图中包含线和点

问题描述 投票:0回答:3

大家好,我正在处理格子图,一切正常,但我在图例方面遇到了一些麻烦。我正在使用

xyplot()
,效果非常棒。我的数据框是
NM
(我在最后部分添加
dput()
版本):

        AMes     A2009     A2010   A2011   A2012   A2013   A2014
1       enero  710004.3 1458624.4 6229245 4407423 3006568 1749746
2     febrero  889398.1  942099.6 5553163 4248144 2615730 1902865
3       marzo 1114883.1 1210951.2 6372920 3537103 2833299 1605746
4       abril 1419242.1 1151423.9 6755055 3500596 3438797 2116088
5        mayo 1585857.2 1598355.1 7119008 4049074 3224926      NA
6       junio 1010455.6 1370856.8 7585412 3279869 2794030      NA
7       julio 1292333.4 1420547.4 7258676 3420974 3003458      NA
8      agosto 1032443.3 2048291.1 7250944 2602310 2486932      NA
9  septiembre 1133260.1 3043637.6 6227707 2225635 2515076      NA
10    octubre 1229593.8 3669634.1 5795989 2853467 2674568      NA
11  noviembre 1074569.6 3641665.2 4015226 2830482 1731063      NA
12  diciembre 1370905.6 6780879.4 5391953 2823591 2054560      NA

我使用下一个代码来生成下一个图:

library(lattice)
library(latticeExtra)
parSettings <- list(layout.widths=list(left.padding=8,rigth.padding=20))
comma_formatter <- function (lim, logsc = FALSE, at = NULL, ...)  {
  ans <- yscale.components.default(lim = lim, logsc = logsc, at = at, ...)
  xxPrime <- as.numeric(ans$left$labels$labels)
  ans$left$labels$labels <- formatC(xxPrime, format = "fg", big.mark = ",")
  ans
}

D <- xyplot(A2009 + A2010 + A2011 + A2012 + A2013 + A2014 ~ factor(NM$AMes, unique(NM$AMes)),
            NM, type=c("p", "l"),
            yscale.components=comma_formatter,
            auto.key=list(space="right", lines=TRUE, points=T),
            par.settings=parSettings,
            layout=c(1, 1), aspect=0.6, main="Delta Index",
            lwd=2, pch=16, cex.axis=4,
            scales=list(x=list(rot=90, font=2, cex=0.8), y=list(font=2), tick.number=9))

结果如下图所示: enter image description here

我想将这个图例的图例放在线条中间,但不要像你所看到的那样分开。另外,我希望获得与图表中图例中的线和点相同的样式。另外我不知道是否可以删除顶部 x 轴和右侧 y 轴,或者至少删除该轴上的中断。我的数据框的

dput()
版本是下一个:

structure(list(AMes = c("enero", "febrero", "marzo", "abril", 
"mayo", "junio", "julio", "agosto", "septiembre", "octubre", 
"noviembre", "diciembre"), A2009 = c(710004.35, 889398.08, 1114883.11, 
1419242.11, 1585857.22, 1010455.56, 1292333.35, 1032443.35, 1133260.11, 
1229593.84, 1074569.64, 1370905.58), A2010 = c(1458624.41, 942099.6, 
1210951.2, 1151423.89, 1598355.1, 1370856.78, 1420547.36, 2048291.06, 
3043637.6, 3669634.09, 3641665.16, 6780879.37), A2011 = c(6229245.09, 
5553163.01, 6372919.9, 6755054.64, 7119008.27, 7585411.87, 7258675.63, 
7250944.21, 6227706.73, 5795989.01, 4015226.43, 5391952.87), 
    A2012 = c(4407422.89, 4248144.11, 3537103.4, 3500595.75, 
    4049074.18, 3279868.96, 3420974.23, 2602310.3, 2225635.25, 
    2853467.41, 2830482.27, 2823590.65), A2013 = c(3006568.05, 
    2615730, 2833299.1, 3438797.32, 3224926.48, 2794029.57, 3003458.16, 
    2486931.57, 2515076.46, 2674568.38, 1731063.04, 2054559.54
    ), A2014 = c(1749745.71, 1902865, 1605746.41, 2116087.84, 
    NA, NA, NA, NA, NA, NA, NA, NA)), .Names = c("AMes", "A2009", 
"A2010", "A2011", "A2012", "A2013", "A2014"), row.names = c(NA, 
-12L), class = "data.frame")

非常感谢您的帮助。

编辑

我不知道是否可以在格子中获得这种风格的图例,其中点位于图例中的线内:

enter image description here

r lattice
3个回答
4
投票

要将图例放在中间,您需要设置

x=
列表的
y=
auto.key
元素,而不是使用
space=
。您传递的坐标范围为 0-1,其中 0,0 位于左下角。你必须尝试一些数字,直到你把它放在正确的位置。

如果您希望图例与绘图相匹配(这毕竟是重点),您应该更改

par.settings
参数中的属性,而不是直接在调用
lwd= 时使用 
pch=
xyplot
 

我相信这应该可以解决问题

library(lattice)
library(latticeExtra)
parSettings <- list(
    layout.widths=list(left.padding=8,rigth.padding=20),
    superpose.line=list(lwd=2),
    superpose.symbol=list(pch=16)
)
comma_formatter <- function (lim, logsc = FALSE, at = NULL, ...)  {
  ans <- yscale.components.default(lim = lim, logsc = logsc, at = at, ...)
  xxPrime <- as.numeric(ans$left$labels$labels)
  ans$left$labels$labels <- formatC(xxPrime, format = "fg", big.mark = ",")
  ans
}

D <- xyplot(A2009+A2010+A2011+A2012+A2013+A2014 ~ factor(NM$AMes,unique(NM$AMes)), NM, 
    type = c("p","l"), 
    yscale.components = comma_formatter,
    auto.key=list(x=.35,y=.82, lines=TRUE,points=T), 
    par.settings = parSettings,layout=c(1,1),aspect=0.6,
    main = "Delta Index",
    cex.axis=4,
    scales=list(x=list(rot=90,font=2,cex=0.8),y=list(font=2),tick.number=9))
D;

updated plot


3
投票

我已经思考这个问题有一段时间了,但我一直很忙,所以到现在为止我没有太多时间来解决这个问题。我更好地理解你原来的问题是什么。默认情况下,莱迪思不喜欢将点堆叠在图例中的线的顶部。这根本不是一个容易获得的选择。然而,如果你愿意深入研究

grid
Lattice
包是建立在这个基础上的),你几乎可以做任何事情。所以我整理了一个我认为可能适合你的解决方案。这应该在以下情况下起作用

  • 图例中只有一列值
  • 你设置
    auto.key=(..., points=T, lines=T)

这里的策略是为绘图提供定制的图例绘制功能。我尝试尽可能多地重用莱迪思的计算。我截取网格视口并进行一些更改以合并线和点。这是自定义的图例绘制功能:

drawComboKey <- function(...) {
    key = simpleKey(...)
    key = draw.key(key, draw = FALSE)

    ngroups <- (length(key$children)-1)/3
    #remove points column
    key$framevp$layout$ncol <- 
        key$framevp$layout$ncol-3L
    key$framevp$layout$respect.mat <- 
        key$framevp$layout$respect.mat[,-(3:5)]
    key$framevp$layout$widths <- 
        key$framevp$layout$widths[-(3:5)]

    #adjust background
    key$children[[1]]$col[2] <- 
        key$children[[1]]$col[2]-3L
    key$children[[1]]$cellvp$layout.pos.col[2] <-
        key$children[[1]]$cellvp$layout.pos.col[2]-3L
    key$children[[1]]$cellvp$valid.pos.col[2] <- 
        key$children[[1]]$cellvp$valid.pos.col[2]-3L

    #combine lines/points
    mylines<-(2+ngroups*2):(1+ngroups*3)
    for(i in mylines) {
        key$children[[i]]$children <- 
            gList(key$children[[i-ngroups]]$children, key$children[[i]]$children)
        key$children[[i]]$childrenOrder <- 
            names(key$children[[i]]$children)
        key$children[[i]]$col <- key$children[[i]]$col-3L
        key$children[[i]]$cellvp$layout.pos.col <- 
            key$children[[i]]$cellvp$layout.pos.col-3L
        key$children[[i]]$cellvp$valid.pos.col <- 
            key$children[[i]]$cellvp$valid.pos.col-3L
    }

    key$childrenOrder<-names(key$children)
    key
}

要使用此函数,您必须截取网格对象并将其设置为图例的绘制函数。那么,从上次的代码开始

library(lattice)
library(latticeExtra)
parSettings <- list(
    layout.widths=list(left.padding=8,rigth.padding=20),
    superpose.line=list(lwd=2),
    superpose.symbol=list(pch=16)
)
comma_formatter <- function (lim, logsc = FALSE, at = NULL, ...)  {
  ans <- yscale.components.default(lim = lim, logsc = logsc, at = at, ...)
  xxPrime <- as.numeric(ans$left$labels$labels)
  ans$left$labels$labels <- formatC(xxPrime, format = "fg", big.mark = ",")
  ans
}

D <- xyplot(A2009+A2010+A2011+A2012+A2013+A2014 ~ factor(NM$AMes,unique(NM$AMes)), NM, 
    type = c("p","l"), 
    yscale.components = comma_formatter,
    auto.key=list(space="right", lines=TRUE,points=TRUE), 
    par.settings = parSettings,layout=c(1,1),aspect=0.6,
    main = "Delta Index",
    cex.axis=4,
    scales=list(x=list(rot=90,font=2,cex=0.8),y=list(font=2),tick.number=9))
D$legend$right$fun = "drawComboKey"
D;

所以你可以在倒数第二行看到我指定了新的绘图函数。差不多就是这样了。这个功能非常脆弱,基本上是一个 hack。如果莱迪思决定改变它构建图例或类似内容的方式,我不能保证它总是有效,因此使用风险自负。尽管如此,这是一个很好的例子,说明了您可以使用网格对象来自定义它们。

结果如下:

legend with overplotted points and lines


3
投票

或者,您也可以只调整按键中的一些设置。

基本上通过在 key 的lines参数中设置 type="b" ,您可以轻松地在线条内添加点

# Your code from above
parSettings <- list(layout.widths=list(left.padding=8,rigth.padding=20))
comma_formatter <- function (lim, logsc = FALSE, at = NULL, ...)  {
ans <- yscale.components.default(lim = lim, logsc = logsc, at = at, ...)
xxPrime <- as.numeric(ans$left$labels$labels)
ans$left$labels$labels <- formatC(xxPrime, format = "fg", big.mark = ",")
ans
}


# create your lattice plot
xyplot(A2009+A2010+A2011+A2012+A2013+A2014 ~ factor(NM$AMes,unique(NM$AMes)), NM, 
   type = "b",par.settings = parSettings,layout=c(1,1),
   aspect=0.6,main = "Delta Index",lwd=2,
   pch=16,cex.axis=4,
   scales=list(x=list(rot=90,font=2,cex=0.8),
               y=list(font=2),tick.number=9,tck=c(1,0)),

   # add a legend using key

   key=list(space="right",
            text=list(paste("A",2009:2014,sep="")),
            lines=list(pch=19,type="b",
                       col=trellis.par.get()$superpose.symbol$col[1:6])))

我还没有尝试弄清楚如何只在键中的线上获取单个点而不是 3 个点,但它可以完成任务。烦人的部分是手动指定颜色,但我确信有一种方法可以直接从网格设置导入颜色的级别数。

希望这有帮助。

Example of lattice key with superposed lines and points

© www.soinside.com 2019 - 2024. All rights reserved.