在R中的晶格图例图中包含线和点 [英] Include lines and points in lattice legend plot in R

查看:127
本文介绍了在R中的晶格图例图中包含线和点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,我在格子图中工作,并且一切正常,但我在图例方面遇到了一些麻烦.我正在使用xyplot(),它的功能很棒.我的数据框是NM(我在最后一部分中添加了dput()版本):

Hi everybody I am working in a lattice graph and all works fine but I have some trouble with legend. I am using xyplot() and it works awesome. My dataframe is NM (I add dput() version in the final part):

        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

我使用了下一个代码来生成下一个情节:

I used the next code to produce the next plot:

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))
D

结果是下一张图:

我想在图的中间得到该图点的图例,但不如yiu所看到的那样分开.另外,我想获得与图例中图例中的线条和点相同的样式.我也不知道是否有可能删除顶部x轴和右侧y轴,或者至少删除该轴上的中断.下一个是我的数据框的dput()版本:

I would like to get in the legend of this plot points in the middle of the lines, but not separated as yiu can see. Also I would like to get the same style that I used in the graph for lines and points in the legend. Also I don't know if it is possible to remove top x axis and right y axis or at least remove the breaks in this axis. The dput() version of my dataframe is the next:

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")

非常感谢您的帮助.

编辑

我不知道是否可以用这种样式将图例插入图例中,其中点位于图例中的线内

I don't know if it is possible to get in lattice a legend with this style, where points are inside lines in the legend:

推荐答案

我已经考虑了一段时间,但是我一直很忙,所以到目前为止我没有太多时间来解决这个问题.我更了解您的原始问题是什么.默认情况下,莱迪思不喜欢将点堆叠在图例中的线条上方.那根本不是一个容易获得的选择.但是,如果您愿意深入研究grid(构建Lattice软件包),您几乎可以做任何事情.因此,我总结了一个我认为可能对您有用的解决方案.这应该在以下时间起作用

I've been thinking about this problem for a while but i've been very busy so I didn't have much time to work on it till now. I understand better what your original question was. By default Lattice does not like to stack the points on top of the lines in the legend. That's simply not an easily accessible option. However, If you're willing do dig into grid (the package Lattice is built on) you can pretty much do anything. So i've hacked together a solution I think may work for you. This should work when

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

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

The strategy here is to supply a customized legend drawing function to the plot. I try to reuse as much of the calculations as I can from Lattice. I intercept the grid viewport and make a few changes to merge the lines and points. Here's the customized legend drawing function:

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
}

要使用此功能,必须拦截网格对象并将其设置为图例的绘图功能.因此,从上次的代码开始

To use this function, you must intercept the trellis object and set this as the drawing function for the legend. So, starting with the code from last time

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;

因此您可以在第二行到最后一行看到我指定了新的绘图功能.就是这样.此功能非常脆弱,基本上是一种破解.我不能保证,如果莱迪思决定更改其构建图例或类似内容的方式,它将始终有效,因此,使用此方法时需您自担风险.但是,这是一个很好的示例,说明了您可以使用网格对象自定义它们的各种操作.

So you can see in the second to the last line I specified our new drawing function. And that's pretty much it. This function is quite fragile and basically a hack. I cannot guarantee that it will always work if Lattice decides to change how it builds legends or anything like that so use at your own risk. Nevertheless, it's a pretty good example of the kinds of things you can do with trellis objects to customize them.

结果如下:

这篇关于在R中的晶格图例图中包含线和点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆