如何为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 即可获得这两个系列。在这种情况下,只有两个系列,其中一个是缩放的,可能不值得切换。

“好看的标签”是主观的,而且比听起来更难。有几个选项,包括:

  1. 使用 ggrepel::geom_text_repel 之类的函数自动移动标签,避免相互重叠。它的工作原理是从一个初始点开始并反复微调,直到标签具有您指定的间隔。许多选项用于调整初始起始位置以及微移的工作方式。

  2. 使用代码手动微调您需要的标签,例如通过针对某些点调整 vjust。例如,您可以使用 vjust 通过预先计算移动平均值并将值与该值进行比较,在低于相邻点的点的线下制作标签。

  3. 之后手动微调点,例如例如,通过使用 officer/svg 输出到可以在 powerpoint 中编辑的矢量文件。

  4. 通过切换到交互式选项(如 ggplotly 并在悬停时查看标签而不是一直查看标签)来完全避免持久性标签。

您还可以查看 scales::comma 等函数来控制标签本身的显示方式。我预计您的死亡标签会有很多小数位数,但您可能只需要其中的整数部分...