ggplot2 — аннотировать внешний график

#r #ggplot2 #annotate

#r #ggplot2 #аннотировать

Вопрос:

Как я могу вставлять аннотации вне графика?

Я хочу добавить примечание поверх первой строки, чтобы сигнализировать о том, что оно продолжается, например, до 1000. Если я использую annotate, заметка не выйдет за пределы графика. (Обратите внимание, что я использую coord_cartesian для ограничения оси y значением 100.)

Вот мой код.

 plot <- ggplot()  
  geom_crossbar(data=GHG, aes(x=Study, y=Avg, ymin=Min, ymax=Max), 
                fill="white", width=0.3)  
  coord_cartesian(ylim=c(0, 100), clip="off")  
  labs(x="", y="g CO2-eq.")  
  annotate("text", x=1, y=150, label=c("150"), vjust=-1)  
  theme(legend.position = "bottom",
        axis.text.x = element_text(angle=0, vjust=1, hjust=0.5),
        panel.grid.major.x= element_blank(),
        panel.grid.minor = element_blank(),
        plot.margin = unit(c(1,3,1,1),"lines"))
  

И вот диаграмма:

введите описание изображения здесь

Комментарии:

1. Вы уверены, что это не из-за того, что положение y вашей аннотации слишком далеко выходит за пределы размеров диаграммы? Сохраняется ли это, если вы измените его на annotate("text", x=1, y=105, ...) ?

2. Да, вырезается все, что выходит за пределы графика (1100).

Ответ №1:

Одна из стратегий заключается в использовании вторичной оси и меток для аннотирования вашей панели. Это немного сложно, потому что только непрерывные масштабы могут иметь вторичную ось.

Я использовал следующее data.frame для целей тестирования:

 GHG <- data.frame(Avg = c(50, 37, 62), Min = c(10, 25, 25), Max = c(1000, 50, 80), Study = c("A", "B", "C"))
  

Код:

 ggplot()  
  geom_crossbar(data=GHG, aes(x=as.numeric(Study), y=Avg, ymin=Min, ymax=Max), 
                fill="white", width=0.3)  
  coord_cartesian(ylim=c(0, 100), clip = "on")  

  scale_x_continuous(position = "top",
                     breaks = 1:length(unique(GHG$Study)),
                     labels = c(1000, rep("", length(unique(GHG$Study)) - 1)),
                     sec.axis = sec_axis(~.,
                                         breaks = 1:length(unique(GHG$Study)),
                                         labels = rep("", length(unique(GHG$Study)))))  

  labs(x="", y="g CO2-eq.")  
  theme(legend.position = "bottom",
        axis.text.x = element_text(angle=0, vjust=1, hjust=0.5),
        panel.grid.major.x= element_blank(),
        panel.grid.minor = element_blank(),
        plot.margin = unit(c(1,3,1,1),"lines"),

        axis.ticks.x.top = element_blank(),
        axis.text.x.top = element_text(size = 14, color = "black", margin = margin(b = 5)))
  

График

Подробные сведения:

aes Немного изменен, чтобы обеспечить непрерывное масштабирование: aes(x=as.numeric(Study), y=Avg, ymin=Min, ymax=Max)

В coord_cartesian(ylim=c(0, 100), clip = "on") : clip установлено значение on для обрезки части полос, которая выходит за пределы области графика.

Добавьте и настройте непрерывный масштаб для X сверху: scale_x_continuous(position = "top",

Вручную добавляйте разрывы для каждого значения исследования: breaks = 1:length(unique(GHG$Study)),

Пометьте первый разрыв текстом, который вы хотите добавить, остальные разрывы не содержат текста: labels = c("text", rep("", length(unique(GHG$Study)) - 1)),

Добавьте дополнительную ось, чтобы отметки оставались внизу. Если они вам не нужны, в этом нет необходимости: sec.axis = sec_axis(~.,

Вручную установите разрывы для непрерывного масштаба: breaks = 1:length(unique(GHG$Study)),

И добавьте пустые метки, чтобы воспроизвести ваш пример: labels = rep("", length(unique(GHG$Study)))))

В theme методе удалите отметки для верхней оси: axis.ticks.x.top = element_blank(),

И, наконец, настройте шрифт, цвет и все остальное для верхней метки: axis.text.x.top = element_text(size = 14, color = "black", margin = margin(b = 5)))