简体   繁体   English

如何在ggplot2 / R的绘图轴限制之外添加垂直线和水平文本?

[英]How can I add vertical lines and horizontal text out of the plot axis limits in ggplot2/R?

I have a barplot made primarily in ggplot2. 我有一个主要在ggplot2中制作的barplot。 I want two vertical lines added and some text below the x-axis. 我想要添加两条垂直线,并在x轴下方添加一些文本。

#Load data
d <- structure(list(author = structure(c(1L, 2L, 4L, 3L, 5L, 6L, 8L, 11L, 13L, 12L, 10L, 9L, 7L), .Label = c("Bahr et al", "Fuller et al", "Garbossa et al", "Gokhale et al", "Iuchi et al", "Lee et al", "Lee Y et all", "Merrel et al", "Newton et al", "Rossetti et al", "Usery et al", "Wychowski et al", "Zachenhofer et al"), class = "factor"), nAE = c(-22L, -34L, -158L, -90L, -70L, -41L, -48L, -32L, -73L, -23L, -25L, -13L, -46L), AE = c(3L, 1L, 7L, 1L, 3L, 10L, 3L, 6L, 3L, 5L, 4L, 6L, 5L), SAE = c(0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 2L, 0L, 0L)), .Names = c("author", "nAE", "AE", "SAE"), class = "data.frame", row.names = c(NA, -13L))

Code to my barplot: 代码到我的barplot:

library(dplyr)
library(tidyr)
library(ggplot2)

categories <- c("Adverse Effect", "No adverse effects", "Severe side effects")
cols <- c("#f6766d", "#01bfc4", "orange")


q <- d %>% 
gather(key, value, -author) %>% 
ggplot(aes(author, value, fill = key)) +
geom_col(alpha=0.9) + 
scale_x_discrete(name="Author") +
scale_y_continuous(name="Number of observations", limits=c(-160,15), 
seq(-160, 15, by=10)) +
theme_grey() +
theme(legend.position = "top") +
scale_fill_manual(labels = categories, values = cols) + 
labs(fill = "")

I have attached a picture below of how I want my barplot to look like. 我已在下面附上一张我希望我的barplot外观的图片。 As you can see, I have added two vertical lines (at random position) and three texts (in photoshop). 如您所见,我添加了两条垂直线(在随机位置)和三个文本(在photoshop中)。

在此处输入图片说明

Thanks in advance, C. 预先感谢,C。

The vertical lines are no problem at all. 垂直线完全没有问题。 Simply use: 只需使用:

  +
  geom_vline(xintercept= 3.5, colour = "red") + 
  geom_vline(xintercept= 10.5, colour = "red")

The values 3.5 and 10.5 mean that the lines intercept the x-axis between the third and fourth and respective between the tenth and eleventh author. 值3.5和10.5表示这些线在第三和第四作者之间以及在第十和第十一位作者之间分别与x轴相交。

Adding text outside the plot is a whole different beast though. 不过,在剧情之外添加文本是完全不同的野兽。 The "cleanest" way I could think of is adding the text inside the plot: 我能想到的“最干净”的方法是在情节中添加文本:

y <- min(d$nAE) + 10
textaes <- data.frame(y = c(y, y, y),
                      x = c(2, 7, 12),
                      lab = c("Text1", "Text2", "Text3"))
q <- d %>% 
  gather(key, value, -author) %>% 
  ggplot(aes(x=author, y=value, fill = key)) +
  geom_col(alpha=0.9) + 
  scale_x_discrete(name="Author") +
  scale_y_continuous(name="Number of observations", limits=c(-160,15), 
                     seq(-160, 15, by=10), expand = c(0.15, 0.05)) +
  theme_grey() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1)) +
  scale_fill_manual(labels = categories, values = cols) + 
  labs(fill = "") +
  geom_vline(xintercept= 3.5, colour = "red") + 
  geom_vline(xintercept= 10.5, colour = "red") +
  geom_text(mapping = aes(y = y, x = x, label = lab), 
            data = textaes, inherit.aes = FALSE)
q

在此处输入图片说明

EDIT: Just found a relatively easy way to add text outside the plot here . 编辑:刚刚找到了一种相对简单的方法来在此处添加图外的文本。 But I don't think it's a very nice solution: 但我认为这不是一个很好的解决方案:

q <- d %>% 
  gather(key, value, -author) %>% 
  ggplot(aes(x=author, y=value, fill = key)) +
  geom_col(alpha=0.9) + 
  scale_x_discrete(name="Author") +
  scale_y_continuous(name="Number of observations", limits=c(-160,15), 
                     seq(-160, 15, by=10), expand = c(0.15, 0.05)) +
  theme_grey() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1)) +
  scale_fill_manual(labels = categories, values = cols) + 
  labs(fill = "") +
  geom_vline(xintercept= 3.5, colour = "red") + 
  geom_vline(xintercept= 10.5, colour = "red")
q

library(grid)
q
grid.text("Text1", x = unit(0.15, "npc"), y = unit(0.1, "npc"), gp=gpar(col="red"))
grid.text("Text2", x = unit(0.5, "npc"), y = unit(0.1, "npc"), gp=gpar(col="red"))
grid.text("Text3", x = unit(0.85, "npc"), y = unit(0.1, "npc"), gp=gpar(col="red"))

在此处输入图片说明

Will gridExtra package be of any help? gridExtra软件包会有所帮助吗? It should deliver something close enough. 它应该提供足够接近的东西。 You can combine 3 plots into 1 using method arrangeGrob or grid.arrange . 您可以使用arrangeGrobgrid.arrange方法将3个图合并为1个图。

https://cran.r-project.org/web/packages/gridExtra/index.html https://cran.r-project.org/web/packages/gridExtra/index.html

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM