Я пытаюсь создать полный набор графиков, используя facet_wrap
из пакета ggplot2 в R.
В качестве упрощенного примера я использовал подмножество набора данных mpg, включенного в ggplot2.
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()
, как предлагается в этой теме: Добавление таблицы в области построения графика ggplot в rp1 = 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', я попытался создать одну сетку со всеми гробами подтаблиц и просто наложить ее на график:
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))
Но тогда организация не совпадает с той, которую использует фасет.., и я подозреваю, что даже если бы я мог поставить две таблицы рядом друг с другом, они были бы отцентрованы и скрыли бы графики...
Можно ли как-то улучшить эту последнюю попытку, выбрав положение подтаблиц? Или есть еще лучший способ решить эту проблему? Очевидным было бы использование geom_table()
, но я не думаю, что эта геометрия существует (пока)...
Любая помощь/подсказка будет высоко оценена! :-)
geom_table
было бы наиболее естественным, но неясно, будет ли такая геометрия хорошо вписываться в панели графиков (обычно таблицы занимают много места и часто скрывают данные в других слоях). За исключением функции интеллектуального позиционирования (минимизация перекрытия), их обычно лучше всего размещать вручную, имхо. - person baptiste   schedule 29.08.2014