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

时间:2012-12-13 14:23:53

标签: r r-grid

我想制作一个类似于beanplotviolin绘图的绘图,但是我想在中心线的不同边上绘制两个不同的分布,而不是对称的形状。像本文[pdf] http://www.jstatsoft.org/v28/c01/paper中的图4。

我想在grid中使用R图形引擎。任何指针都会很有用。我查看了lattice包和histogram包中的lattice函数,但这不是我想要做的。

感谢任何帮助/指示。

1 个答案:

答案 0 :(得分:4)

你可以通过对Sarkar格子包中的函数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]])