Многострочный заголовок 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_tag

Самый простой способ - это использовать заголовок и подзаголовок,

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))

Другие вопросы по тегам