我正在尝试使用R中ggplot2包中的facet_wrap
创建一套完整的图。
作为简化示例,我使用了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()
:Adding table within the plotting region of a ggplot in r
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' doc page上的示例后,我尝试创建一个包含所有子表格的网格,并将其简单地叠加在图上:
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使用的组织不匹配,我怀疑即使我可以将两个表彼此相邻,它们也会居中并隐藏这些情节...
有没有办法通过选择子表的位置来改进最后的尝试?或者是否有更好的方法来解决这个问题?一个显而易见的是使用geom_table()
,但我不认为这个geom存在(还)......
任何帮助/提示都将不胜感激! : - )
答案 0 :(得分:0)
这是令人惊叹的软件包ggpmisc
的解决方案:
library(ggpmisc)
library(dplyr)
library(tibble)
myData <- filter(mpg, manufacturer == "audi" | manufacturer == "chevrolet")
gg <- ggplot(myData, aes(x=hwy, y=cty, colour=model)) +
facet_wrap(~ manufacturer) +
geom_point(size = 3) +
geom_smooth(stat="identity")
tb <- myData %>%
group_by(manufacturer, model) %>%
summarize(var1 = round(mean(displ)), var2 = round(mean(cyl))) %>%
ungroup()
tbs <- lapply(split(tb, tb$manufacturer), "[", -1)
df <- tibble(x = rep(-Inf, length(tbs)),
y = rep(Inf, length(tbs)),
manufacturer = levels(as.factor(tb$manufacturer)),
tbl = tbs)
gg + geom_table(data = df, aes(x = x, y = y, label = tbl),
hjust = 0, vjust = 1)