如何在R中使用网格图形绘制直方图?

3
我想制作一个类似于beanplotviolin图的图表,但不是对称形状,而是在中心线的两侧绘制两个不同的分布。就像这篇文章中的第4个图[PDF]http://www.jstatsoft.org/v28/c01/paper所示。
我想使用R中的grid图形引擎。任何提示都将非常有用。我查看了lattice包和lattice包中的histogram函数,但那不是我想做的事情。
感谢任何帮助/指针。

@BenBarnes 它在第六页(第六页只有一个图)。它确实是一个箱线图的替代方案。 - MattLBeck
@Mattrition,哦,这是一个有趣的情节。啊,是第四图,不是第四页。 - BenBarnes
我不完全确定 OP 需要什么。从论文中可以清楚地看出,图形可以使用 beanplot 生成,甚至提供了相应的代码。 - MattLBeck
@BenBarnes 可能我的理解有误,也许它是箱线图的替代品,但我认为这是一个非常有趣的图表,我相信我的工作可以从中受益。 - Sam
2
@Sam 你缺少什么?生成它的代码在第6页上。只需插入您自己的数据即可。 - MattLBeck
1
看一下singer数据集,特别是voice.part列。 - BenBarnes
1个回答

4
您可以通过对Sarkar的lattice包中的panel.violin函数进行简单修改,相对容易地获得半小提琴图。该函数中有四行代码可以在grid.polygon调用内进行更改,以从“双侧”密度绘图变为单侧密度绘图。首先需要require(lattice)require(grid)。然后输入panel.violin。我将展示给您“水平”修改的示例:
require(grid)
panel.violin2  <-  
    # snipped all the arguments and processing

       grid.polygon(x = c(dx.list[[i]] ), 
   # Notice I removed: ... ,rev(dx.list[[i]]) 
               y = c(2*dy.list[[i]]    ), default.units = "native", 
   # Removed: ...  , -rev(dy.list[[i]])
               name = trellis.grobname(identifier, type = "panel", 
                 group = group), gp = gpar(fill = col, col = border, 
                 lty = lty, lwd = lwd, alpha = alpha))

同时,也要将它从else{ ...}子句的相应部分中移除。现在您可以使用help(panel.violin)中的示例来运行它。
bwplot(voice.part ~ height, singer,
       panel = function(..., box.ratio) {
           panel.violin2(..., col = "transparent",
                        varwidth = FALSE, box.ratio = box.ratio)
           panel.bwplot(..., fill = NULL, box.ratio = .1)
       } )

enter image description here

如果您想要在另一侧获得密度,您需要做的就是删除dx.list [[i]]和dy.list [[i]],并保留rev(dx.list[[i]])-rev(dy.list[[i]])


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