我尝试在ggplot
中尽可能好地复制gapminder中的生育率图:
我有:
fertility <- read.csv("https://raw.githubusercontent.com/MarcoKuehne/marcokuehne.github.io/main/data/Gapminder/tfr-by-gapminder-v12-20171212.csv", sep = ";")
# manipulate
library(tidyverse)
fertility <- fertility %>%
select(!c(geo.name, geo, indicator)) %>%
rownames_to_column %>%
gather(var, value, -rowname) %>%
spread(rowname, value) %>%
rename(year = var, fert = `1`) %>%
slice_head(n = 301)
fertility[,1:2] <- sapply(fertility[,1:2],FUN=as.numeric)
fertility1 <- fertility[1:217,]
fertility2 <- fertility[218:301,]
# visualize
ggplot(data = fertility, aes(x=year, y=fert)) +
geom_point(aes(x=year[1], y=fert[1]), size = 4) +
geom_text(aes(x=year[1], y=fert[1], label = year[1]), vjust = 2.5) +
geom_point(aes(x=year[165], y=fert[165]), size = 4) +
geom_text(aes(x=year[165], y=fert[165], label = year[165]), vjust = -3, hjust = -0.5) +
geom_text(aes(x=year[165], y=fert[165], label = "5 births"), vjust = -1.5, hjust = -0.2) +
#geom_point(aes(x=year[217], y=fert[217]), size = 4) +
geom_text(aes(x=year[217], y=fert[217], label = year[217]), vjust = -3) +
geom_text(aes(x=year[217], y=fert[217], label = "2.5 births"), vjust = -1.5) +
geom_line(data = fertility1, size=1.3, arrow=arrow(length=unit(0.30,"cm"), ends="last", type = "closed")) +
geom_line(data = fertility2, size=1.3,linetype="dashed") +
labs(title = "Average Number Of Babies Per Woman From 1800 to Today",
caption = "Source: Gapminder based on UN-Pop", y="", x="") +
theme_minimal() +
theme(panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank())
我对geom_line()
的线宽有一些问题。我正在寻找geom_line()
和geom_smooth()
之间的折衷方案,以使线图更平滑一点。
但我现在最担心的是y轴的断裂,当y轴不是从零开始的时候,我想在gapminder的图表中强调一下。
2条答案
按热度按时间yr9zkbsy1#
根据@罗兰的建议,您可以使用
loess
曲线来平滑线条。但是,我建议不要尝试使用geom_smooth
,而是在ggplot之外进行计算,因为我们还需要点和标签的平滑值,并且我们还需要“两条”线的相同值。对于轴中断,一个简单的方法是使用两个
annotate
,一个放置segment
,一个添加填充的“间隙”,我使用ribbon
。来修复限制并设置clip="off"
。还请注意,我通过geom_h/vline
添加了轴线,以便注解层可以放置在轴的顶部。最后,我稍微调整了数据管理代码,使用数据集放置标签和点,而不是使用
vjust
,我直接通过y
位置移动标签。编辑最后,我添加了一些额外的造型。
mklgxw1f2#
关键是要加上:
它告诉R将y的范围限制在0和6.2之间,并且在这两个值之外不显示间隙。下面的示例代码可能对你有用,运行后,你会得到: