- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在文本框标签(例如下图中的 Journal H 文本框)和相应的数据点之间绘制连接线,但无法找到在 R 上执行此操作的方法,除了在 PowerPoint/Illustrator 上完成它。我的图像看起来像这样
这是我的输入数据的样子:
Journal Year Impact_Factor
1 Journal A 2010 1.91
2 Journal B 2010 9.18
3 Journal C 2012 1.65
4 Journal D 2012 2.40
5 Journal E 2012 3.68
6 Journal B 2013 9.18
7 Journal F 2013 0.79
8 Journal G 2014 1.99
9 Journal H 2016 15.54
10 Journal I 2017 3.82
11 Journal H 2017 15.54
12 Journal B 2019 9.18
13 Journal J 2019 6.78
14 Journal K 2019 3.22
15 Journal L 2020 4.26
16 Journal M 2020 11.08
17 Journal N 2021 4.62
下面是我使用的 R 代码:
library(ggplot2)
library(ggthemes)
library(RColorBrewer)
nb.cols <- 16
mycolors <- colorRampPalette(brewer.pal(8, "Set2"))(nb.cols)
df <- read.csv("Test_publications_list.csv", header=TRUE)
ggplot(df, aes(x=Year, y=Impact_Factor, color=Journal)) +
geom_point(color= "black", shape= 21, size= 5, stroke= 1, aes(fill = Journal)) +
scale_fill_manual(values = mycolors) +
theme_gdocs() +
geom_label(aes(x = 2017, y = 14, label = "Journal H", fontface= 2), color = "black", fill= NA) +
theme(plot.margin = unit(c(1,1,1,1), "cm")) +
ggtitle("Summary plot showing my publications\n in academic journals") +
theme(plot.title = element_text(color= "black", size = 10, face = "bold"))
如果有人能让我知道在这个 R 图上添加连接线的便捷方法,我将非常感激
最佳答案
这里有一个建议,让ggrepel
控制推开多远。
library(ggrepel)
ggplot(df, aes(x=Year, y=Impact_Factor, color=Journal)) +
geom_point(color= "black", shape= 21, size= 5, stroke= 1, aes(fill = Journal)) +
scale_fill_manual(values = mycolors) +
# theme_gdocs() + # I don't have ggthemes installed
geom_label_repel(
aes(label = Journal),
data = ~ subset(., Journal == "Journal H" & Year == 2017),
color = "black", fill= NA, box.padding = 1.5
) +
theme(plot.margin = unit(c(1,1,1,1), "cm")) +
ggtitle("Summary plot showing my publications\n in academic journals") +
theme(plot.title = element_text(color= "black", size = 10, face = "bold"))
我从强制位置(在代码中)转向允许它使用原始数据,并将标签移离该点。我的使用data = ~ subset( )
使用 rlang
-风格波形符函数和基本 R 的 subset
,.
子集调用中的是当时有效的数据。您还可以使用dplyr::filter
如果您已经加载 dplyr
并且更喜欢它。您还可以指定 data=df[...]
如果您愿意,可以直接使用,尽管我经常在第一次调用 ggplot(.)
之前找到一些 dplyr-pipe ,在这种情况下原始 df
可能与 ggplot2
的数据不一样。使用data=~subset(...)
使其透明/一致。
注:ggrepel
使用随机过程来优化排斥文本/标签。这意味着如果您有多个标签,它们可能会在图与图之间发生变化。您可以使用许多“控件”,例如某些鼓励方向(左/右)的功能。
我认为使用 ggrepel
的力量就是你不再需要考虑把东西放在哪里。如果没有它,您所需要的只是略有不同的数据,并且您的硬编码标签位置可能都需要更改。
另一种方法是在点和一个标签之间绘制多条线:
我们首先为标签生成一个框架:
lbls <- data.frame(Journal = "Journal H", xend = 2017, yend = 14)
merge(lbls, df, by = "Journal")
# Journal xend yend Year Impact_Factor
# 1 Journal H 2017 14 2017 15.54
# 2 Journal H 2017 14 2016 15.54
从这里,我们使用geom_segment
和调整后的geom_label
:
ggplot(df, aes(x=Year, y=Impact_Factor, color=Journal)) +
geom_point(color= "black", shape= 21, size= 5, stroke= 1, aes(fill = Journal)) +
scale_fill_manual(values = mycolors) +
# theme_gdocs() +
geom_segment(aes(xend = xend, yend = yend),
data = merge(lbls, df, by = "Journal")) +
geom_label(aes(x = xend, y = yend, label = Journal),
data = lbls, color = "black", fontface = 2, fill = NA) +
theme(plot.margin = unit(c(1,1,1,1), "cm")) +
ggtitle("Summary plot showing my publications\n in academic journals") +
theme(plot.title = element_text(color= "black", size = 10, face = "bold"))
如您所见,根据标签框的默认偏移量,线条的位置位于标签中心。我们可以对此进行调整。另外,我们需要删除一个额外的图例,因此我们将添加 scale_*
.
lbls2 <- data.frame(Journal = "Journal H", xend = 2017, yend = 14, hjust = 0, vjust = 1)
ggplot(df, aes(x=Year, y=Impact_Factor, color=Journal)) +
geom_point(color= "black", shape= 21, size= 5, stroke= 1, aes(fill = Journal)) +
scale_fill_manual(values = mycolors) +
# theme_gdocs() +
geom_segment(aes(xend = xend, yend = yend),
data = merge(lbls, df, by = "Journal")) +
scale_color_discrete(guide = FALSE) +
geom_label(aes(x = xend, y = yend, label = Journal, hjust = hjust, vjust = vjust),
data = lbls2, color = "black", fontface = 2, fill = NA) +
theme(plot.margin = unit(c(1,1,1,1), "cm")) +
ggtitle("Summary plot showing my publications\n in academic journals") +
theme(plot.title = element_text(color= "black", size = 10, face = "bold"))
现在给了我们
您可能需要进行更多调整。我希望您考虑这种方法的最大收获:
x=
和y=
正如您所使用的,使用框架,它的可扩展性更高;geom_segment
让我们添加从点“A”到点“B”的单独线段(在本例中,对于特定期刊,“B”是不变的,但这只是为了方便);x=
和y=
每个段的(绑定(bind)到我们用于标签放置的 xend=
和 yend=
;以及lbls
中解决。框架。关于r - 如何在ggplot2上的文本框标签和数据点之间绘制连接线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67221274/
我是一名优秀的程序员,十分优秀!