geom_label_repel 中不同颜色的边框

And*_*lez 5 r ggplot2

我正在为不同国家/地区制作图表,在这些国家/地区我使用 geom_label_repel 手动添加文本。我在更改该文本中的边框颜色时遇到问题(我希望它的颜色与文本不同)。这是一个可重现的示例:

\n
\n#Create dataframe \ncountries <- c("Mundo", "Argentina", "Brasil", "Chile", "Colombia", "Mexico", "Per\xc3\xba", "Estados Unidos")\ncountries <- rep(countries, 120)\nvaccinations <- data.frame(countries)\nvaccinations$countries <- factor(vaccinations$countries , levels = c("Mundo", "Argentina", "Brasil", "Chile",\n                                                          "Colombia", "Mexico", "Per\xc3\xba", "Estados Unidos"))\nvaccinations <- vaccinations %>%\n  group_by(countries) %>%\n  mutate(month = 1:120,\n         vaccines = runif(120, min = 0, max = 5))\n\n#Write text to add manually in each country\nsaved_text <- data.frame(\n  label_pais = c("10.10 per 100", "11.76 per 100", "12.58 per 100", "62.94 per 100", \n                 "5.98 per 100", "8.84 per 100", "3.18 per 100", "55.96 per 100"),\n  countries  = c("Mundo", "Argentina", "Brasil", "Chile",\n               "Colombia", "Mexico", "Per\xc3\xba", "Estados Unidos"))\n\nsaved_text$countries <- factor(saved_text$countries, levels = c("Mundo", "Argentina", "Brasil", "Chile",\n                                                                    "Colombia", "Mexico", "Per\xc3\xba", "Estados Unidos"))\n\n#Plot\nggplot()+\n  geom_line(data = vaccinations, \n            aes(x = month, y = vaccines, colour = factor(countries)), size = 2, show.legend = FALSE) +\n  facet_wrap( ~ countries, ncol = 4)+\n  geom_label_repel(data = saved_text,\n                   aes(y = 6, x = 1, label = label_pais)) #How can I change the border color?\n
Run Code Online (Sandbox Code Playgroud)\n

我明白了\n在此输入图像描述\n我知道 geom_label_repel 中的颜色参数会更改边框的颜色(以及文本颜色),但我想要的是文本颜色为黑色,边框为红色。有谁知道如何实现这一目标?提前致谢!

\n

Ian*_*ell 4

这是一个具有挑战性的问题。主要是因为颜色仅在 grob 中定义一次,这适用于边框和文本本身。

让我们从获取一些颜色开始:

ggplot() +
  geom_line(data = vaccinations, 
            aes(x = month, y = vaccines, colour = factor(countries)), size = 2, show.legend = FALSE) +
  facet_wrap( ~ countries, ncol = 4) +
  geom_label_repel(data = saved_text,
                   aes(y = 6, x = 1, label = label_pais, color = factor(countries))) 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

ggrepel这完全是一种黑客行为,但让我们动态编辑包的代码。我窥探了源代码,直到找到创建文本的函数。

首先,我们需要卸载包。然后使用fixInNamespace编辑绘图功能:

unloadNamespace("ggrepel")
fixInNamespace("makeContent.labelrepeltree","ggrepel")
Run Code Online (Sandbox Code Playgroud)

如果您使用 Rstudio,您将获得一个弹出编辑器。如果您使用的是控制台,您会看到略有不同的东西。在第 77 行,您将找到定义文本属性的位置。

在此输入图像描述

更改row$colour"black"并保存更改。您可能会收到错误消息。不用担心。

现在,重新加载包后重复相同的代码:

library(tidyverse)
library(ggrepel)
ggplot() +
  geom_line(data = vaccinations, 
            aes(x = month, y = vaccines, colour = factor(countries)), size = 2, show.legend = FALSE) +
  facet_wrap( ~ countries, ncol = 4) +
  geom_label_repel(data = saved_text,
                   aes(y = 6, x = 1, label = label_pais, color = factor(countries))) 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

当您重新启动 R 会话时,所有这些都会恢复。