Многострочный заголовок ggplot2, разные отступы
Я создаю графики для публикации, и я хотел бы иметь возможность пометить панели рисунка в самом ggplot (в отличие от экспорта в издатель и т. Д.), Чтобы они просто аккуратно совмещались в итоговом документе. Я собирался попытаться сделать это, добавив букву ("А") в заголовок, но я бы хотел, чтобы мои заголовки были в центре, и мне бы хотелось, чтобы буква была в верхнем левом углу.
# base graph:
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species))+
geom_jitter(size = 6.5)+
ggtitle("A \n \n The Actual Long, Normal Title of Titliness")+
theme(plot.title = element_text(hjust = 0.5, face = "bold", size = 30),
axis.ticks = element_blank(),
legend.text = element_text(size = 25),
axis.title = element_text(size = 25, face = "bold"),
axis.text = element_text(size = 25, vjust = 0.05),
legend.position = "bottom")
Теперь, если я хочу просто "подделать это", поместив каждый заголовок вручную, я смогу заставить его работать, но это кажется трудоемким и грубым.
# sloppy solution
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species))+
geom_jitter(size = 6.5)+
ggtitle("A \n \n The Actual Long, Normal Title of Titliness")+
theme(plot.title = element_text(hjust = 0,face = "bold", size = 30),
axis.ticks = element_blank(),
legend.text = element_text(size = 25),
axis.title = element_text(size = 25, face = "bold"),
axis.text = element_text(size = 25, vjust = 0.05),
legend.position = "bottom")
Есть ли способ вызывать каждую "строку" заголовка отдельно для собственного значения hjust?
Любые другие креативные решения?
Кроме того, я видел потенциал в mtext ( разделение меток осей с помощью выражений), но не мог понять, как реализовать его с помощью ggplot2 (против функции базового графика... кажется, что они не совместимы). Этот пост был очень интересным ( многострочный заголовок ggplot с другим размером шрифта, лицом и т. Д.), Но я все еще новичок в R и не мог понять, как отредактировать этот умный материал, чтобы изменить отступ.
Спасибо!
5 ответов
Обновление: поскольку в ggplot2 3.0.0 теперь есть встроенная поддержка меток, см. Этот ответ.
Вот как я бы это сделал, используя пакет cowplot, который я написал специально для этой цели. Обратите внимание, что вы получите чистую тему в качестве бонуса.
library(cowplot)
p <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species)) +
geom_jitter(size = 3.5) +
ggtitle("The Actual Long, Normal Title of Titliness")
# add one label to one plot
ggdraw(p) + draw_plot_label("A")
# place multiple plots into a grid, with labels
plot_grid(p, p, p, p, labels = "AUTO")
Затем вы хотите использовать save_plot
функция сохранения графиков вместо ggsave
, так как save_plot
имеет значения по умолчанию и параметры, которые помогут вам получить правильное масштабирование по отношению к теме, в частности, для графиков в сетке.
Поскольку ggplot2 3.0.0
есть родной способ сделать это, используя tag
ярлык:
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species)) +
geom_point() +
labs(title = "The Actual Long, Normal Title of Titliness",
tag = "A")
Самый простой способ - это использовать заголовок и подзаголовок,
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species))+
geom_jitter(size = 6.5) +
labs(title = "A", subtitle = "The Actual Long, Normal Title of Titliness") +
theme(plot.subtitle = element_text(hjust = 0.5))
Вы можете сделать это, манипулируя Grobs. С помощью gtable
а также grid
на вершине ggplot2
,
library("ggplot2")
library("gtable")
library("grid")
p <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species))+
geom_jitter(size = 6.5)+
ggtitle("The Actual Long, Normal Title of Titliness")+
theme(plot.title = element_text(hjust = 0.5, face = "bold", size = 30),
axis.ticks = element_blank(),
legend.text = element_text(size = 25),
axis.title = element_text(size = 25, face = "bold"),
axis.text = element_text(size = 25, vjust = 0.05),
legend.position = "bottom",
plot.margin = unit(c(4, 1, 1, 4), "lines")) # We need bigger top/left margins to show the letter
gt <- ggplot_gtable(ggplot_build(p)) # Building a gtable from the ggplot object
# Adding the textGrob for the panel letter
panel_letter = textGrob("A", x = 0.5, y = .9,
just = c("left", "top"),
gp = gpar(fontsize = 40, col = "black", face="bold"))
gt <- gtable_add_grob(gt, panel_letter, t=1, l=1, r=1) # Append the Grob to the table
p <- grid.draw(gt) # Display the plot
ggsave("plot.png",gt, width=10, height=10) # If you want to save it.
Ты можешь использовать grid.text
из пакета grid
Добавьте текст к своему сюжету. Сначала добавьте немного места над заголовком plot.margin
,
library(grid)
p <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, shape = Species))+
geom_jitter(size = 6.5)+
ggtitle("The Actual Long, Normal Title of Titliness")+
theme(plot.title = element_text(hjust = 0,face = "bold", size = 30),
axis.ticks = element_blank(),
legend.text = element_text(size = 25),
axis.title = element_text(size = 25, face = "bold"),
axis.text = element_text(size = 25, vjust = 0.05),
legend.position = "bottom",
plot.margin = unit(c(4, 3, 1, 1), "lines"))
p
grid.text('A', x = unit(0.1, 'npc'), y = unit(.90, 'npc'), gp = gpar(fontsize=28))