对齐 ggrepel 标签
Aligning ggrepel labels
我有一个脚本可以下载一些关于一些空军基地周围区域的 COVID 数据并生成图表。我打算尝试使用一个大的 dput() 来重现它,但是对于 post 来说它的字符太多了。可以从 here.
复制用于重现数据帧的 dput()
数据本身看起来像
head(smDailyBaseData)
DaysSince Base abbv newRate label
<drtn> <chr> <chr> <dbl> <chr>
1 7 days Edwards EdwardsAFB 0 "Edwards \n 0"
2 8 days Edwards EdwardsAFB 0.00000140 "Edwards \n 2"
3 9 days Edwards EdwardsAFB 0.00000140 "Edwards \n 0"
4 10 days Edwards EdwardsAFB 0.00000140 "Edwards \n 0"
5 11 days Edwards EdwardsAFB 0.00000140 "Edwards \n 0"
6 12 days Edwards EdwardsAFB 0.00000140 "Edwards \n 0"
737 行...
剧情代码为
#endpoint layer
BaseEndpoints <- smDailyBaseData %>%
group_by(Base) %>%
filter(DaysSince == max(DaysSince)) %>%
select(Base, abbv, DaysSince, newRate,label) %>%
ungroup()
ZoomEndpoints <- BaseEndpoints %>% filter(Base != 'Hanscom') %>%
mutate(zoom = TRUE)
MAEndPoint <- BaseEndpoints %>% filter(Base == 'Hanscom') %>%
mutate(zoom = FALSE)
ZoomEndpoints <- rbind(ZoomEndpoints, MAEndPoint)
BasePlot <- smDailyBaseData %>%
ggplot(mapping = aes(x = as.numeric(DaysSince), y = newRate)) +
geom_line(aes(color=abbv),show.legend = FALSE) +
scale_color_ucscgb() +
geom_point(data = BaseEndpoints,size = 1.5,shape = 21,
aes(color = abbv,fill = abbv), show.legend = FALSE) +
geom_label_repel(data=ZoomEndpoints, aes(label=label), show.legend = FALSE,
vjust = 0) +
labs(x = "Days Since First Confirmed Case",
y = "% Local Population Infected Daily") +
theme(plot.title = element_text(size = rel(1), face = "bold"),
plot.subtitle = element_text(size = rel(0.7)),
plot.caption = element_text(size = rel(1))) +
facet_zoom(xlim = c(50,130), ylim=c(0,0.0075),zoom.data=zoom)
print(BasePlot)
结果就是这个剧情
尽管缩放了,但仍然有点拥挤,标签覆盖了大量数据。我想让所有标签都排列在缩放图的右侧,所有空白 space 都在那里(比如,x 轴上的 120 以上),然后它们可以有更长的时间线连接到端点。但我没能做到这一点。我已经尝试将 direction
润湿到 y 并按照 here 所述使用 hjust
但没有得到我正在寻找的距离或对齐方式。
如有任何指导,我们将不胜感激。
您正在寻找 geom_label_repel()
中的 xlim=
和 ylim=
参数。它们的工作方式与轴限制相同,但它们是 "repelled" 标签的限制。您可以稍微玩一下,但这是将该行更改为以下内容后的结果:
geom_label_repel(data=ZoomEndpoints, aes(label=label), show.legend = FALSE,
vjust = 0, xlim=c(100,120), size=3, direction = 'y')
您的实际情况可能会有所不同,因为输出取决于图形设备分辨率和纵横比。
我有一个脚本可以下载一些关于一些空军基地周围区域的 COVID 数据并生成图表。我打算尝试使用一个大的 dput() 来重现它,但是对于 post 来说它的字符太多了。可以从 here.
复制用于重现数据帧的 dput()数据本身看起来像
head(smDailyBaseData)
DaysSince Base abbv newRate label
<drtn> <chr> <chr> <dbl> <chr>
1 7 days Edwards EdwardsAFB 0 "Edwards \n 0"
2 8 days Edwards EdwardsAFB 0.00000140 "Edwards \n 2"
3 9 days Edwards EdwardsAFB 0.00000140 "Edwards \n 0"
4 10 days Edwards EdwardsAFB 0.00000140 "Edwards \n 0"
5 11 days Edwards EdwardsAFB 0.00000140 "Edwards \n 0"
6 12 days Edwards EdwardsAFB 0.00000140 "Edwards \n 0"
737 行...
剧情代码为
#endpoint layer
BaseEndpoints <- smDailyBaseData %>%
group_by(Base) %>%
filter(DaysSince == max(DaysSince)) %>%
select(Base, abbv, DaysSince, newRate,label) %>%
ungroup()
ZoomEndpoints <- BaseEndpoints %>% filter(Base != 'Hanscom') %>%
mutate(zoom = TRUE)
MAEndPoint <- BaseEndpoints %>% filter(Base == 'Hanscom') %>%
mutate(zoom = FALSE)
ZoomEndpoints <- rbind(ZoomEndpoints, MAEndPoint)
BasePlot <- smDailyBaseData %>%
ggplot(mapping = aes(x = as.numeric(DaysSince), y = newRate)) +
geom_line(aes(color=abbv),show.legend = FALSE) +
scale_color_ucscgb() +
geom_point(data = BaseEndpoints,size = 1.5,shape = 21,
aes(color = abbv,fill = abbv), show.legend = FALSE) +
geom_label_repel(data=ZoomEndpoints, aes(label=label), show.legend = FALSE,
vjust = 0) +
labs(x = "Days Since First Confirmed Case",
y = "% Local Population Infected Daily") +
theme(plot.title = element_text(size = rel(1), face = "bold"),
plot.subtitle = element_text(size = rel(0.7)),
plot.caption = element_text(size = rel(1))) +
facet_zoom(xlim = c(50,130), ylim=c(0,0.0075),zoom.data=zoom)
print(BasePlot)
结果就是这个剧情
尽管缩放了,但仍然有点拥挤,标签覆盖了大量数据。我想让所有标签都排列在缩放图的右侧,所有空白 space 都在那里(比如,x 轴上的 120 以上),然后它们可以有更长的时间线连接到端点。但我没能做到这一点。我已经尝试将 direction
润湿到 y 并按照 here 所述使用 hjust
但没有得到我正在寻找的距离或对齐方式。
如有任何指导,我们将不胜感激。
您正在寻找 geom_label_repel()
中的 xlim=
和 ylim=
参数。它们的工作方式与轴限制相同,但它们是 "repelled" 标签的限制。您可以稍微玩一下,但这是将该行更改为以下内容后的结果:
geom_label_repel(data=ZoomEndpoints, aes(label=label), show.legend = FALSE,
vjust = 0, xlim=c(100,120), size=3, direction = 'y')
您的实际情况可能会有所不同,因为输出取决于图形设备分辨率和纵横比。