如何使用图例在末尾创建带有单个几何点的几何线图

Ped*_*zar 6 r ggplot2

我想重现我在《纽约时报》上找到的情节: 在此处输入图片说明 dput数据是:

structure(list(`Gss year for this respondent` = c(1977, 1977, 
                                                  1977, 1978, 1978, 1978, 1980, 1980, 1980, 1982, 1982, 1982, 1983, 
                                                  1983, 1983, 1984, 1984, 1984, 1985, 1985, 1985, 1987, 1987, 1987, 
                                                  1988, 1988, 1988, 1989, 1989, 1989, 1990, 1990, 1990, 1991, 1991, 
                                                  1991, 1993, 1993, 1993, 1994, 1994, 1994, 1996, 1996, 1996, 1998, 
                                                  1998, 1998, 2000, 2000, 2000, 2002, 2002, 2002, 2004, 2004, 2004, 
                                                  2006, 2006, 2006, 2008, 2008, 2008, 2010, 2010, 2010, 2012, 2012, 
                                                  2012, 2014, 2014, 2014, 2016, 2016, 2016, 2018, 2018, 2018), 
               `Political party affiliation` = c("Democrat", "Independent", 
                                                 "Republican", "Democrat", "Independent", "Republican", "Democrat", 
                                                 "Independent", "Republican", "Democrat", "Independent", "Republican", 
                                                 "Democrat", "Independent", "Republican", "Democrat", "Independent", 
                                                 "Republican", "Democrat", "Independent", "Republican", "Democrat", 
                                                 "Independent", "Republican", "Democrat", "Independent", "Republican", 
                                                 "Democrat", "Independent", "Republican", "Democrat", "Independent", 
                                                 "Republican", "Democrat", "Independent", "Republican", "Democrat", 
                                                 "Independent", "Republican", "Democrat", "Independent", "Republican", 
                                                 "Democrat", "Independent", "Republican", "Democrat", "Independent", 
                                                 "Republican", "Democrat", "Independent", "Republican", "Democrat", 
                                                 "Independent", "Republican", "Democrat", "Independent", "Republican", 
                                                 "Democrat", "Independent", "Republican", "Democrat", "Independent", 
                                                 "Republican", "Democrat", "Independent", "Republican", "Democrat", 
                                                 "Independent", "Republican", "Democrat", "Independent", "Republican", 
                                                 "Democrat", "Independent", "Republican", "Democrat", "Independent", 
                                                 "Republican"), value = c("Yes", 
                                                                                                             "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", 
                                                                                                             "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", 
                                                                                                             "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", 
                                                                                                             "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", 
                                                                                                             "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", 
                                                                                                             "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", 
                                                                                                             "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", 
                                                                                                             "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", 
                                                                                                             "Yes", "Yes", "Yes", "Yes", "Yes"), n = c(226L, 191L, 130L, 
                                                                                                                                                       188L, 194L, 109L, 210L, 235L, 127L, 281L, 264L, 127L, 174L, 
                                                                                                                                                       200L, 139L, 176L, 220L, 140L, 200L, 192L, 147L, 285L, 227L, 
                                                                                                                                                       161L, 142L, 113L, 80L, 159L, 122L, 113L, 124L, 136L, 115L, 
                                                                                                                                                       142L, 127L, 129L, 180L, 161L, 112L, 351L, 311L, 207L, 306L, 
                                                                                                                                                       299L, 202L, 283L, 280L, 141L, 246L, 306L, 128L, 144L, 160L, 
                                                                                                                                                       77L, 138L, 121L, 80L, 307L, 290L, 156L, 214L, 198L, 117L, 
                                                                                                                                                       199L, 227L, 91L, 245L, 209L, 80L, 306L, 310L, 97L, 342L, 
                                                                                                                                                       337L, 127L, 300L, 333L, 96L), Percent = c(0.336, 0.38, 0.392, 
                                                                                                                                                                                                 0.311, 0.352, 0.306, 0.375, 0.419, 0.383, 0.327, 0.426, 0.363, 
                                                                                                                                                                                                 0.283, 0.37, 0.356, 0.324, 0.421, 0.381, 0.337, 0.416, 0.325, 
                                                                                                                                                                                                 0.352, 0.41, 0.385, 0.398, 0.334, 0.292, 0.407, 0.425, 0.333, 
                                                                                                                                                                                                 0.416, 0.455, 0.377, 0.409, 0.398, 0.419, 0.483, 0.445, 0.354, 
                                                                                                                                                                                                 0.485, 0.471, 0.375, 0.479, 0.421, 0.378, 0.427, 0.409, 0.295, 
                                                                                                                                                                                                 0.403, 0.407, 0.286, 0.462, 0.475, 0.307, 0.466, 0.382, 0.307, 
                                                                                                                                                                                                 0.488, 0.374, 0.293, 0.463, 0.396, 0.343, 0.49, 0.433, 0.312, 
                                                                                                                                                                                                 0.538, 0.421, 0.274, 0.536, 0.44, 0.271, 0.531, 0.461, 0.298, 
                                                                                                                                                                                                 0.607, 0.513, 0.283)), class = c("grouped_df", "tbl_df", 
                                                                                                                                                                                                                                  "tbl", "data.frame"), row.names = c(NA, -78L), groups = structure(list(
                                                                                                                                                                                                                                    `Gss year for this respondent` = c(1977, 1977, 1977, 1978, 
                                                                                                                                                                                                                                                                       1978, 1978, 1980, 1980, 1980, 1982, 1982, 1982, 1983, 1983, 
                                                                                                                                                                                                                                                                       1983, 1984, 1984, 1984, 1985, 1985, 1985, 1987, 1987, 1987, 
                                                                                                                                                                                                                                                                       1988, 1988, 1988, 1989, 1989, 1989, 1990, 1990, 1990, 1991, 
                                                                                                                                                                                                                                                                       1991, 1991, 1993, 1993, 1993, 1994, 1994, 1994, 1996, 1996, 
                                                                                                                                                                                                                                                                       1996, 1998, 1998, 1998, 2000, 2000, 2000, 2002, 2002, 2002, 
                                                                                                                                                                                                                                                                       2004, 2004, 2004, 2006, 2006, 2006, 2008, 2008, 2008, 2010, 
                                                                                                                                                                                                                                                                       2010, 2010, 2012, 2012, 2012, 2014, 2014, 2014, 2016, 2016, 
                                                                                                                                                                                                                                                                       2016, 2018, 2018, 2018), `Political party affiliation` = c("Democrat", 
                                                                                                                                                                                                                                                                                                                                  "Independent", "Republican", "Democrat", "Independent", "Republican", 
                                                                                                                                                                                                                                                                                                                                  "Democrat", "Independent", "Republican", "Democrat", "Independent", 
                                                                                                                                                                                                                                                                                                                                  "Republican", "Democrat", "Independent", "Republican", "Democrat", 
                                                                                                                                                                                                                                                                                                                                  "Independent", "Republican", "Democrat", "Independent", "Republican", 
                                                                                                                                                                                                                                                                                                                                  "Democrat", "Independent", "Republican", "Democrat", "Independent", 
                                                                                                                                                                                                                                                                                                                                  "Republican", "Democrat", "Independent", "Republican", "Democrat", 
                                                                                                                                                                                                                                                                                                                                  "Independent", "Republican", "Democrat", "Independent", "Republican", 
                                                                                                                                                                                                                                                                                                                                  "Democrat", "Independent", "Republican", "Democrat", "Independent", 
                                                                                                                                                                                                                                                                                                                                  "Republican", "Democrat", "Independent", "Republican", "Democrat", 
                                                                                                                                                                                                                                                                                                                                  "Independent", "Republican", "Democrat", "Independent", "Republican", 
                                                                                                                                                                                                                                                                                                                                  "Democrat", "Independent", "Republican", "Democrat", "Independent", 
                                                                                                                                                                                                                                                                                                                                  "Republican", "Democrat", "Independent", "Republican", "Democrat", 
                                                                                                                                                                                                                                                                                                                                  "Independent", "Republican", "Democrat", "Independent", "Republican", 
                                                                                                                                                                                                                                                                                                                                  "Democrat", "Independent", "Republican", "Democrat", "Independent", 
                                                                                                                                                                                                                                                                                                                                  "Republican", "Democrat", "Independent", "Republican", "Democrat", 
                                                                                                                                                                                                                                                                                                                                  "Independent", "Republican"), .rows = list(1L, 2L, 3L, 4L, 
                                                                                                                                                                                                                                                                                                                                                                             5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 
                                                                                                                                                                                                                                                                                                                                                                             17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 
                                                                                                                                                                                                                                                                                                                                                                             28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 
                                                                                                                                                                                                                                                                                                                                                                             39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 
                                                                                                                                                                                                                                                                                                                                              

dc3*_*c37 10

对于geom_pointand geom_text,您可以通过仅保留去年(2018 年)来对数据框进行子集化:

ggplot(df, aes(x = `Gss year for this respondent`, y = Percent*100))+
  geom_line(aes(color = `Political party affiliation`), show.legend = FALSE)+
  geom_point(data = df[df$`Gss year for this respondent` == max(df$`Gss year for this respondent`),],
             aes(x =`Gss year for this respondent`, y = Percent*100, color = `Political party affiliation`), show.legend = FALSE)+
  geom_text(data = df[df$`Gss year for this respondent` == max(df$`Gss year for this respondent`),],
            aes(x =`Gss year for this respondent`, 
                y = Percent*100, 
                colour = `Political party affiliation`,
                label = `Political party affiliation`), show.legend = FALSE, hjust = -0.1)+
  xlim(1975, 2026)+
  ylim(0,80)+
  scale_color_manual(values = c("blue","green","red"))

Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


and*_*ece 5

以下是对 @dc37 答案的一些更新,使 OP 更接近所需的情节。需要明确的是,@dc37 的答案解决了主要问题:如何绘制系列中的最后一个点。所有这些都太多了,无法作为 @dc37 答案的评论添加,因此我将其作为单独的解决方案发布 - 尽管它实际上更多的是 @dc37 答案的扩展,而不是一个独特的替代方案。

更新

  • 修复了 x 轴范围,以便在轴停止后出现注释

  • 删除注释中的颜色

  • 消除绘图上 x 轴线和 y=0 之间的空间

  • 在 x 轴刻度线周围创建空间(轴线和刻度文本之间的空间)

  • 显示主要 y 轴网格线

  • 使 x 和 y 刻度与原始刻度相匹配

    ggplot(df, aes(x = `Gss year for this respondent`, y = Percent*100, 
               color = `Political party affiliation`)) +
    geom_line(show.legend = FALSE, size = 1) +
    geom_point(data = point_df, aes(x =`Gss year for this respondent`), 
               show.legend = FALSE, size = 2) +
    scale_x_continuous(breaks = seq(1980, 2015, by = 5)) +
    scale_y_continuous(limits = c(0, 80), 
                       breaks = seq(0, 80, by = 20),
                       expand = c(0, 0)) +
    scale_color_manual(values = c("deepskyblue1","gray80","firebrick3")) +
    geom_text(data = point_df,
              aes(x = 2019, y = Percent*100, 
                  label = `Political party affiliation`), 
              color = "black",
              show.legend = FALSE, 
              hjust = -0.1) +
    coord_cartesian(xlim = c(1978, 2016), clip = 'off') +
    theme(plot.margin = unit(c(1,7,1,1), "lines"),
          panel.grid.major.y = element_line(color = "gray90"),
          axis.line.y = element_blank(),
          axis.ticks.length.x = unit(.3, units = "cm"),
          axis.ticks.x = element_line(linetype = 2)) +
    labs(y = "", x = "")  
    
    Run Code Online (Sandbox Code Playgroud)

    阴谋

重要
从 OP 的数据生成的图表 - 在 OP 的代码中复制,以及这个答案和 @dc37 的答案 - 看起来与原始屏幕截图略有不同。(看看线条如何不以同样的方式相互重叠。)我还没有深入研究这一点 - 这里的更新主要集中在化妆品上。