我正在尝试使用facet_wrap
R 中的 ggplot2 包创建一组完整的图。
作为一个简化示例,我使用了 ggplot2 中包含的数据集 mpg 的一个子集
library(plyr)
library(ggplot2)
library(gtable)
library(gridExtra)
myData = subset(mpg, manufacturer == "audi" | manufacturer == "chevrolet")
myData = droplevels(myData)
这是我绘制数据的代码:
p = ggplot(myData, aes(x=hwy, y=cty, colour=model) )
p = p + facet_wrap( ~ manufacturer)#, scales="free") # sets panel division
p = p + geom_point(size = 3) # sets points aspect
p = p + geom_smooth(stat="identity")
print(p)
现在棘手的部分来了……我有另一个数据框“indivParam”,其中包含我想在绘图上显示为表格的额外信息。让我们说这个愚蠢的:
indivParam = ddply(myData, .(manufacturer , model), summarize,
var1 = unique(class),
var2 = round(mean(displ)),
var3 = round(mean(cyl)))
我要做的是在每个面板上添加一个子表,其中包含从 indivParam 中提取的信息。例如,在绘图的第一个面板上添加下表:
tg = tableGrob(subset(indivParam, manufacturer == "audi"),
show.rownames=FALSE, gp=gpar(fontsize=8, lwd=2),
xmin=15, xmax=30, ymin=10, ymax=20)
grid.newpage()
grid.draw(tg)
我尝试了几种选择...
使用
annotate()
但此参数不传递数据帧...annotation_custom()
按照此线程中的建议使用:在 r 中的 ggplot 的绘图区域内添加表p1 = p + annotation_custom(tableGrob(indivParam, show.rownames=FALSE, gp=gpar(fontsize=8, lwd=2)), xmin=15, xmax=30, ymin=10, ymax=20) print(p1)
这也不起作用,因为它在每个面板上显示整个表,而不是包含与每个面板相关的数据的子表 ()
最后,在阅读了“tableGrob”文档页面上的示例之后,我尝试创建一个包含所有子表 grobs 的网格,并将其简单地叠加在图上:
lg <- lapply(as.character(unique(indivParam$manufacturer)), function(x) tableGrob( as.data.frame(dlply(indivParam, .(manufacturer))[x]), name="test",show.rownames=FALSE, gp=gpar(fontsize=8, lwd=2))) grid.newpage() print(p) grid.draw(do.call(arrangeGrob, lg))
但是,组织与 facet 使用的不匹配..,我怀疑即使我可以将两张表并排放置,它们也会居中并隐藏情节......
有什么办法可以通过选择子表的位置来改进最后一次尝试?或者有没有更好的方法来解决这个问题?一个明显的方法是使用 ageom_table()
但我不认为这个 geom 存在(还)......
任何帮助/提示将不胜感激!:-)