r - 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 中的颜色参数会改变边框的颜色(以及文本颜色),但我想要的是文本颜色,比如说黑色和红色边框。有谁知道如何实现这一目标?提前致谢!
解决方案
这是一个具有挑战性的问题。主要是因为颜色只在 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 会话时,所有这些都将恢复。
推荐阅读
- mongodb - MongoDB:使用字段值作为字段名
- repast-simphony - Repast:在批处理运行期间抑制错误
- r - 如何将 facet_wrap(~list) 与列表一起使用?
- python - 如何计算匹配的特征数量?
- javascript - 使用 getBoundingClientRect() 数据重新定位项目
- reactjs - 在 useEffect 依赖项中使用 localstorage 有效,但会发出警告
- pandas - Pandas - 为绘图日期创建累积总和
- c# - 在 Azure 中写入 blob
- python - 使用 set_yticklabels 时如何反转 (invert_yaxis())
- firebase - 是否可以通过 Firebase 无密码身份验证发送 OTP 而不是链接?