Есть ли элегантный способ выровнять строки tableGrob с разрывами оси?
Я хотел бы сопоставить диаграммы tableGrob и ggplot в R (мне нужно воспроизвести некоторые выходные данные SAS, которые использовались в предыдущих версиях общедоступного отчета). Как этот минимально воспроизводимый пример:
Этот пост меня очень дал - tableGrob находится в той же таблице gtable строка как тело диаграммы; однако для того, чтобы строки в tableGrob совпали с метками осей, требуется много ручной работы.
Я также нашел этот пост. Поскольку я публикую публичный отчет, я бы предпочел не использовать код, который не всегда доступен в пакете на CRAN. При этом экспериментальная версия tableGrob, похоже, принимает высоту в качестве аргумента. Если этот код сработает, а я решу использовать эту экспериментальную версию, как мне рассчитать соответствующую высоту строк?
Если нет элегантного способа сделать это, я счел полезными следующие приемы:
- установите размер шрифта и cex в tableGrob, чтобы он соответствовал ggplot2
- установите padding.v для размещения строк таблицы в tableGrob
- изменить пределы координат, чтобы разместить метки столбцов и выровнять их по нижней части последней строки
Мой код MRE:
library(ggplot2)
library(gridExtra)
library(gtable)
theme_set(theme_bw(base_size = 8))
df <- head(mtcars,10)
df$cars <- row.names(df)
df$cars <- factor(df$cars, levels=df$cars[order(df$disp, decreasing=TRUE)], ordered=TRUE)
p <- ggplot(data=df, aes(x=hp, y=cars)) +
geom_point(aes(x=hp, y=cars)) +
scale_y_discrete(limits=levels(df$cars))+
theme(axis.title.y = element_blank()) +
coord_cartesian(ylim=c(0.5,length(df$cars)+1.5))
t <- tableGrob(df[,c("mpg","cyl","disp","cars")],
cols=c("mpg","cyl","disp","cars"),
gpar.coretext = gpar(fontsize = 8, lineheight = 1, cex = 0.8),
gpar.coltext = gpar(fontsize = 8, lineheight = 1, cex = 0.8),
show.rownames = FALSE,
show.colnames = TRUE,
equal.height = TRUE,
padding.v = unit(1.65, "mm"))
g <- NULL
g <- ggplotGrob(p)
g <- gtable_add_cols(g, unit(2,"in"), 0)
g <- gtable_add_grob(g, t, t=3, b=3, l=1, r=1)
png('./a.png', width = 5, height = 2, units = "in", res = 100)
grid.draw(g)
dev.off()
Я оставил названия автомобилей на разрывах оси Y для устранения неполадок, но в конечном итоге я их уберу.
unit(1/n, "npc")
в ячейке, соответствующей панели графика из макета gtable. - person baptiste   schedule 28.01.2014