如何为ggplot2中的每个geom_line添加标签和点?
How to add labels and points to each geom_line in ggplot2?
我有一个名为 (casos_obitos) 的数据框,看起来像这样:
EPI_WEEK CASES DEATHS
SE 51 1053 19
SE 52 1384 21
SE 53 1892 25
SE 01/21 1806 43
我正在用 ggplot 绘制一个图,将病例和死亡放在两个不同的 geom_lines 中。这是我的代码:
scl = 10
ggplot(data = casos_obitos, aes(x = EPI_WEEK, y = CASES, fill = CASES, group =1))+
scale_y_continuous(limits = c(0, max(casos_obitos$CASES)+10), expand = expansion(mult = c(0, .1)),
sec.axis = sec_axis(~./scl, name = "Nº de Óbitos"))+
geom_line(aes(x = SEM_EPI, y = CASES, color = "CASES"), size = 1)+
geom_line(aes(x = SEM_EPI, y = DEATHS*scl, color = "DEATHS"), size = 1) +
geom_text(aes(label= CASES), hjust= 0.5, vjust = -2, size= 2.0, color= "black") +
labs(x = "Semana Epidemiológica", y = "Nº de Casos") +
scale_colour_manual(" ", values=c("CASES" = "blue", "DEATHS" = "red"))+
theme_minimal(base_size = 10) +
theme(legend.position = "bottom", axis.line = element_line(colour = "black"),
axis.text.x=element_text(angle = 90, vjust = 0.5, hjust=1, color="black"),
axis.text.y=element_text(color="black"))
现在,我的情节是这样的:
其中蓝线是病例一栏,红线是死亡一栏。我需要在红线上贴上标签,但我似乎找不到答案。我也想以“好看”的方式放置标签,这样我就可以理解数字,而且它们看起来不像现在那样凌乱。
谢谢!
您应该能够添加以下内容以在底线上获取标签:
geom_text(aes(y = DEATHS*scl, label= DEATHS), hjust= 0.5, vjust = -2, size= 2.0, color= "black") +
您还可以考虑将数据重塑为长格式,以便将 CASES 和 DEATHS(缩放后)值组合到同一列中,并用另一列区分哪个系列与每个值相关。 ggplot2 通常可以更流畅地处理这种形式的数据——您可以将颜色美感映射到指定哪个系列的列,然后您只需要一个 geom_line
和一个 geom_text
即可获得这两个系列。在这种情况下,只有两个系列,其中一个是缩放的,可能不值得切换。
“好看的标签”是主观的,而且比听起来更难。有几个选项,包括:
使用 ggrepel::geom_text_repel
之类的函数自动移动标签,避免相互重叠。它的工作原理是从一个初始点开始并反复微调,直到标签具有您指定的间隔。许多选项用于调整初始起始位置以及微移的工作方式。
使用代码手动微调您需要的标签,例如通过针对某些点调整 vjust。例如,您可以使用 vjust 通过预先计算移动平均值并将值与该值进行比较,在低于相邻点的点的线下制作标签。
之后手动微调点,例如例如,通过使用 officer
/svg
输出到可以在 powerpoint 中编辑的矢量文件。
通过切换到交互式选项(如 ggplotly
并在悬停时查看标签而不是一直查看标签)来完全避免持久性标签。
您还可以查看 scales::comma
等函数来控制标签本身的显示方式。我预计您的死亡标签会有很多小数位数,但您可能只需要其中的整数部分...
我有一个名为 (casos_obitos) 的数据框,看起来像这样:
EPI_WEEK CASES DEATHS
SE 51 1053 19
SE 52 1384 21
SE 53 1892 25
SE 01/21 1806 43
我正在用 ggplot 绘制一个图,将病例和死亡放在两个不同的 geom_lines 中。这是我的代码:
scl = 10
ggplot(data = casos_obitos, aes(x = EPI_WEEK, y = CASES, fill = CASES, group =1))+
scale_y_continuous(limits = c(0, max(casos_obitos$CASES)+10), expand = expansion(mult = c(0, .1)),
sec.axis = sec_axis(~./scl, name = "Nº de Óbitos"))+
geom_line(aes(x = SEM_EPI, y = CASES, color = "CASES"), size = 1)+
geom_line(aes(x = SEM_EPI, y = DEATHS*scl, color = "DEATHS"), size = 1) +
geom_text(aes(label= CASES), hjust= 0.5, vjust = -2, size= 2.0, color= "black") +
labs(x = "Semana Epidemiológica", y = "Nº de Casos") +
scale_colour_manual(" ", values=c("CASES" = "blue", "DEATHS" = "red"))+
theme_minimal(base_size = 10) +
theme(legend.position = "bottom", axis.line = element_line(colour = "black"),
axis.text.x=element_text(angle = 90, vjust = 0.5, hjust=1, color="black"),
axis.text.y=element_text(color="black"))
现在,我的情节是这样的:
其中蓝线是病例一栏,红线是死亡一栏。我需要在红线上贴上标签,但我似乎找不到答案。我也想以“好看”的方式放置标签,这样我就可以理解数字,而且它们看起来不像现在那样凌乱。
谢谢!
您应该能够添加以下内容以在底线上获取标签:
geom_text(aes(y = DEATHS*scl, label= DEATHS), hjust= 0.5, vjust = -2, size= 2.0, color= "black") +
您还可以考虑将数据重塑为长格式,以便将 CASES 和 DEATHS(缩放后)值组合到同一列中,并用另一列区分哪个系列与每个值相关。 ggplot2 通常可以更流畅地处理这种形式的数据——您可以将颜色美感映射到指定哪个系列的列,然后您只需要一个 geom_line
和一个 geom_text
即可获得这两个系列。在这种情况下,只有两个系列,其中一个是缩放的,可能不值得切换。
“好看的标签”是主观的,而且比听起来更难。有几个选项,包括:
使用
ggrepel::geom_text_repel
之类的函数自动移动标签,避免相互重叠。它的工作原理是从一个初始点开始并反复微调,直到标签具有您指定的间隔。许多选项用于调整初始起始位置以及微移的工作方式。使用代码手动微调您需要的标签,例如通过针对某些点调整 vjust。例如,您可以使用 vjust 通过预先计算移动平均值并将值与该值进行比较,在低于相邻点的点的线下制作标签。
之后手动微调点,例如例如,通过使用
officer
/svg
输出到可以在 powerpoint 中编辑的矢量文件。通过切换到交互式选项(如
ggplotly
并在悬停时查看标签而不是一直查看标签)来完全避免持久性标签。
您还可以查看 scales::comma
等函数来控制标签本身的显示方式。我预计您的死亡标签会有很多小数位数,但您可能只需要其中的整数部分...