首页 > 解决方案 > 如何为 geom_line 创建的图表中的选定行添加标签?

问题描述

使用下面的代码,我可以创建我感兴趣的图表(请参见下图)。每条线代表一个状态。我想通过将所有线条设为灰色来自定义图表,除了去年(Year=2016)我感兴趣的结果变量(logageadjustedrate)中的 5 个最高比率。我还想将统计名称添加到 5 个最高费率中。但是我得到一个错误:“geom_path:每个组只包含一个观察。你需要调整组审美吗?”

这是我的代码:

library(dplyr, warn.conflicts = FALSE)

d_filtered <- policy_and_cause_of_deaths_fe %>%
  group_by(state_name) %>% 
  filter(Year=='2016' & logageadjustedrate>5.5) %>%  
  ungroup()

    ggplot() +
      # draw the original data series with grey
      geom_line(aes(x =Year, y = logageadjustedrate, group=state_name), data = policy_and_cause_of_deaths_fe, colour = alpha("grey", 0.7)) +
      # colourise only the filtered data
      geom_line(aes(x =Year, y = logageadjustedrate, colour = state_name), data = d_filtered)+
      theme(legend.position="none")

在此处输入图像描述

标签: rggplot2

解决方案


您的问题是您过滤的数据集仅包含一年。但是你不能只用一个数据点画一条线,这就是你收到警告的原因。

仅使用ggplot2dplyr您可以达到您想要的结果,如下所示:

  1. 获取 2016 年您的前 5 个州的名称。而不是硬编码我dplyr::top_n用来获取前 5 个州的值。

  2. 为了突出显示线条,请过滤您的数据集以获得最高状态。这样你的代码就可以工作了。

  3. 用于添加标签(和/或仅突出显示去年)按去年过滤。

  4. 要添加标签,请使用 3. 中的数据集来添加州名称geom_text(另外我添加了一个geom_point以突出显示顶级州的去年。

使用一些随机数据试试这个:

# Random data
set.seed(2)
d <- data.frame(
  Year = rep(2009:2016, 52),
  logageadjustedrate = runif(8 * 52, 4, 7),
  state_name = rep(c(LETTERS, letters), each = 8)
)

library(ggplot2)
library(dplyr, warn.conflicts = FALSE)

top_states <- d %>%
  filter(Year=='2016') %>% 
  top_n(5, logageadjustedrate) %>% 
  pull(state_name)

d_filtered_line <- d %>% 
  filter(state_name %in% top_states)

d_filtered_point <- d %>% 
  filter(state_name %in% top_states, Year == 2016)

ggplot(mapping = aes(x =Year, y = logageadjustedrate)) +
  # draw the original data series with grey
  geom_line(aes(group=state_name), data = d, colour = alpha("grey", 0.7)) +
  # colourise only the filtered data
  geom_line(aes(colour = state_name), data = d_filtered_line)+
  geom_point(aes(colour = state_name), data = d_filtered_point)+
  geom_text(aes(colour = state_name, label = state_name), nudge_x = .2, data = d_filtered_point)+
  theme(legend.position="none")


推荐阅读