Как добавить таблицу в мой вывод ggplot2?
Есть ли быстрый способ добавить таблицу в мой график ggplot2? Я хотел бы, чтобы эта таблица имела значение каждой строки в тех же контрольных точках, что указано в scale_x_continuous()
, но с рядом с ними процентным (%) символом. Моя конечная цель - создать что-то вроде изображения ниже. Однако я не знаю, как добавить таблицу.
![gains chart example]()
Следующий блок кода просто делает две строки в ggplot2 и должен быть достаточным, чтобы предоставить мне пример:
require(ggplot2)
df <- data.frame(a = seq(0, 90, 10), b = seq(10, 100, 10))
df.plot <- ggplot(data = df, aes(x = seq(1, 100, 10))) + geom_line(aes(y = a), colour = 'red') +
geom_line(aes(y = b), colour = 'blue') + scale_x_continuous(breaks = seq(0,100,10))
df.plot
Аналогичный вопрос был задан здесь, но данный ответ скорее обходным путем и не подходит для таблицы с двумя строками. Я собираюсь возиться с подсказками, предоставленными Брайаном Диггсом, но я решил, что опубликую это на случай, если кто-то уже сделал что-то подобное. Любая помощь будет принята с благодарностью!
Изменить: Спасибо @baptiste за то, что помогли мне разобраться в этом. Я опубликовал свой собственный ответ ниже, который закончил то, что он начал.
Ответы
Ответ 1
Вот базовый пример стратегии, используемой learnr:
require(ggplot2)
df <- data.frame(a = seq(0, 90, 10), b = seq(10, 100, 10))
df.plot <- ggplot(data = df, aes(x = seq(1, 100, 10))) +
geom_line(aes(y = a), colour = 'red') +
geom_line(aes(y = b), colour = 'blue') +
scale_x_continuous(breaks = seq(0,100,10))
# make dummy labels for the table content
df$lab <- month.abb[ceiling((df$a+1)/10)]
df.table <- ggplot(df, aes(x = a, y = 0,
label = lab, colour = b)) +
geom_text(size = 3.5) +
theme_minimal() +
scale_y_continuous(breaks=NULL)+
theme(panel.grid.major = element_blank(), legend.position = "none",
panel.border = element_blank(), axis.text.x = element_blank(),
axis.ticks = element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank())
gA <- ggplotGrob(df.plot)
gB <- ggplotGrob(df.table)[6,]
gB$heights <- unit(1,"line")
require(gridExtra)
gAB <- rbind(gA, gB)
grid.newpage()
grid.draw(gAB)
![enter image description here]()
Ответ 2
Вот script, который создает общую таблицу, которую я собираюсь сделать. Обратите внимание, что я включил названия таблиц, изменив имена под scale_y_continuous
для каждой строки.
require(ggplot2)
require(gridExtra)
df <- data.frame(a = seq(0, 90, 10), b = seq(10, 100, 10))
df.plot <- ggplot(data = df, aes(x = seq(1, 100, 10))) +
geom_line(aes(y = a), colour = 'red') +
geom_line(aes(y = b), colour = 'blue') +
scale_x_continuous(breaks = seq(0,100,10))
# make dummy labels for the table content
lab.df <- data.frame(lab1 = letters[11:20],
lab2 = letters[1:10])
df.table1 <- ggplot(lab.df, aes(x = lab1, y = 0,
label = lab1)) +
geom_text(size = 5, colour = "red") +
theme_minimal() +
scale_y_continuous(breaks=NULL, name = "Model Lift") +
theme(panel.grid.major = element_blank(), legend.position = "none",
panel.border = element_blank(), axis.text.x = element_blank(),
axis.ticks = element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_text(angle = 0, hjust = 5))
df.table2 <- ggplot(lab.df, aes(x = lab2, y = 0,
label = lab2)) +
geom_text(size = 5, colour = "blue") +
theme_minimal() +
scale_y_continuous(breaks=NULL, name = "Random")+
theme(panel.grid.major = element_blank(), legend.position = "none",
panel.border = element_blank(), axis.text.x = element_blank(),
axis.ticks = element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_text(angle = 0, hjust = 3.84))
# silly business to align the two plot panels
gA <- ggplotGrob(df.plot)
gB <- ggplotGrob(df.table1)
gC <- ggplotGrob(df.table2)
maxWidth = grid::unit.pmax(gA$widths[2:3], gB$widths[2:3], gC$widths[2:3])
gA$widths[2:3] <- as.list(maxWidth)
gB$widths[2:3] <- as.list(maxWidth)
gC$widths[2:3] <- as.list(maxWidth)
grid.arrange(gA, gB, gC, ncol=1, heights=c(10, .3, .3))
![sample plot]()