首页 > 解决方案 > geom_label_repel 中不同颜色的边框

问题描述

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


#Create dataframe 
countries <- c("Mundo", "Argentina", "Brasil", "Chile", "Colombia", "Mexico", "Perú", "Estados Unidos")
countries <- rep(countries, 120)
vaccinations <- data.frame(countries)
vaccinations$countries <- factor(vaccinations$countries , levels = c("Mundo", "Argentina", "Brasil", "Chile",
                                                          "Colombia", "Mexico", "Perú", "Estados Unidos"))
vaccinations <- vaccinations %>%
  group_by(countries) %>%
  mutate(month = 1:120,
         vaccines = runif(120, min = 0, max = 5))

#Write text to add manually in each country
saved_text <- data.frame(
  label_pais = c("10.10 per 100", "11.76 per 100", "12.58 per 100", "62.94 per 100", 
                 "5.98 per 100", "8.84 per 100", "3.18 per 100", "55.96 per 100"),
  countries  = c("Mundo", "Argentina", "Brasil", "Chile",
               "Colombia", "Mexico", "Perú", "Estados Unidos"))

saved_text$countries <- factor(saved_text$countries, levels = c("Mundo", "Argentina", "Brasil", "Chile",
                                                                    "Colombia", "Mexico", "Perú", "Estados Unidos"))

#Plot
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)) #How can I change the border color?

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

标签: rggplot2

解决方案


这是一个具有挑战性的问题。主要是因为颜色只在 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))) 

在此处输入图像描述

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

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

unloadNamespace("ggrepel")
fixInNamespace("makeContent.labelrepeltree","ggrepel")

如果您使用的是 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))) 

在此处输入图像描述

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


推荐阅读