如何使用lattice添加重叠直方图

5
使用此问题中的数据https://stackoverflow.com/questions/21663108/coloring-points-on-a-lattice-plot-in-r,我想使用lattice中的histogram函数在同一图上分别绘制三个直方图,以便我可以控制颜色并允许重叠部分半透明显示。
然而,以下代码无法实现:
histogram(locs[locs.col=="darkblue"] , breaks=20, xlim=c(25,150),col="darkblue" )
histogram(locs[locs.col=="yellow"] , breeaks=20, xlim=c(25,150),col="yellow",add=T ) # add doesn't work here
histogram(locsy[locs.col=="red"] , breaks=20, xlim=c(25,150),col="red",add=T )

因为直方图不会互相添加。我知道这在基础包中的hist函数中是有效的,所以我有以下问题:
1)有没有一种方法可以使用histogram将直方图添加到绘图中? 2)如何使每个直方图实例的箱子宽度相同 3)如何使颜色半透明,以便直方图重叠的地方能够显示出来? 4)如何旋转直方图90度,使频率成为水平轴?

要重叠lattice图,您可以使用laticeExtra包中的as.layer()函数。(我实际测试过,但是即使使用透明颜色,重叠直方图的结果也很难解释,所以我拒绝发布它!) - Josh O'Brien
2个回答

8

有时候,重叠的直方图可以是易于理解和信息丰富的,然而,通常最好使用bwplotviolin plot。不管怎样:

histogram( ~Sepal.Length,
     data = iris,
     type = "p",
     breaks = seq(4,8,by=0.2),
     ylim = c(0,30),
     groups = Species,
     panel = function(...)panel.superpose(...,panel.groups=panel.histogram,
                          col=c("cyan","magenta","yellow"),alpha=0.4),
     auto.key=list(columns=3,rectangles=FALSE,
                   col=c("cyan","magenta","yellow3"))
     )

overlapping histograms in R with lattice, Sepal.Length from iris data


1
这做到了42-(以及其他人)说不能做的事情。难以置信。目前这可能是网络上唯一的此类信息来源。 - Mars

1

格子直方图函数不支持基础绘图中的add=T。此外,在格子中获取并排或重叠的绘图的通常方法是使用“groups”参数,而直方图不支持groups。但帮助页面说densityplot将支持,并且它还会绘制数据点的位置并接受alpha-transparency参数:

df <- data.frame(locs=locs, locs.col=locs.col,dataset=dataset)
densityplot(~locs, groups=locs.col,data=df , xlim=c(25,150), alpha=.5 )

enter image description here

如果你想使用自己的颜色,可以尝试: ...,col=locs.col,... 在最初是评论如何“旋转”密度图的基础上添加材料:
将直方图调用与密度集成的示例,令人惊讶的是我得到了(或者责备)的信用:

http://markmail.org/search/?q=list%3Aorg.r-project.r-help++densityplot+switch+x+y#query:list%3Aorg.r-project.r-help%20%20densityplot%20switch%20x%20y+page:1+mid:oop3shncxgx4mekc+state:results

使用densityplot替代直方图作为包装函数,这样可以更好地尊重其更极端的范围。当你这样做时,会出现一个错误,说“breaks”无效,但如果你阅读?histogram页面,它建议设置breaks=NULL可能会产生可接受的默认行为,在这种情况下似乎是这样的:
densityplot(~x,data=foo,groups=grp, 
#prepanel=function(x,type,groups,...){???}, 
  panel=function(x,type,groups,...){ 
    panel.densityplot(x,groups=groups,...) 
    panel.histogram(x,col='transparent', breaks = NULL, ...)

} ) 

-------引用材料结束-------

以下是Dieter Menne提供的一个黑客示例,展示如何将被黑客攻击的面板拼接到格子中:

http://markmail.org/search/?q=list%3Aorg.r-project.r-help++densityplot+switch+x+y#query:list%3Aorg.r-project.r-help%20%20densityplot%20switch%20x%20y+page:1+mid:fyva5hrio6cn4fs2+state:results

谢谢。对于旋转图形有什么建议吗?我无法在lattice中弄清楚如何做到这一点。 - user3290303
如果您键入 panel.densityplot,则会得到一个函数,最后是对 panel.lines 的调用。通过将输入切换为 x 和 y 来轻松进行黑客攻击。如果您希望把地毯图(沿 y=0 抖动点)旋转为 y,您可能还需要黑客攻击 panel.rug。如果我为了钱或名声而这样做,我会搜索 rhelp 的存档,看看 Deepayan Sarkar(lattice 的作者)是否已被要求这样做。 - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接