You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决ggplot2折线图中的锯齿状图形问题?

问题描述

尝试制作折线图展示不同州的监狱人口增长情况,单个州分析时图表正常,但加入多个州后,图表出现上下突变的锯齿状图形。

原代码如下:

get_jail_pop_by_states <- function(states) {
  state_growth <- incarceration_trends %>% 
    select(total_jail_pop, year, state)
  select_state <- state_growth %>% 
    filter(state == states)
  return(select_state)   
}

View(get_jail_pop_by_states("MO"))

plot_jail_pop_by_states <- function(states) {
  p <- ggplot(get_jail_pop_by_states(states), aes(x=year, y=total_jail_pop, color= state))+
    stat_summary(fun.y="mean", geom= "line") +
    xlab("Year") + 
    ylab("Total jail popultion") + 
    ggtitle("Growth of Prison Population by State")

  return(p)
}
plot_jail_pop_by_states(c("CA","WA", "OR"))
解决建议

问题原因

  1. 多州筛选逻辑错误:使用state == states匹配多个州时,R的向量匹配逻辑会导致筛选结果异常,无法正确选中所有目标州的数据。
  2. 冗余的均值计算:stat_summary(fun.y="mean")会对每年的所有州数据计算均值,而非按州单独绘制折线,这直接导致了锯齿状的异常图形。

修改后的代码

get_jail_pop_by_states <- function(states) {
  state_growth <- incarceration_trends %>% 
    select(total_jail_pop, year, state)
  # 使用%in%匹配多个州
  select_state <- state_growth %>% 
    filter(state %in% states)
  return(select_state)   
}

plot_jail_pop_by_states <- function(states) {
  p <- ggplot(get_jail_pop_by_states(states), aes(x=year, y=total_jail_pop, color= state))+
    # 直接用geom_line绘制各州的折线,无需计算均值
    geom_line() +
    xlab("Year") + 
    ylab("Total jail population") + 
    ggtitle("Growth of Prison Population by State")

  return(p)
}
plot_jail_pop_by_states(c("CA","WA", "OR"))

修改说明

  • 把筛选条件state == states替换为state %in% states:这是R中匹配多个取值的标准语法,能正确筛选出所有目标州的记录。
  • 移除stat_summary,改用geom_line():由于每个州每年对应唯一的监狱人口总数,直接绘制折线即可保证图形的连续性,避免均值计算带来的异常。

内容的提问来源于stack exchange,提问作者xvijerhe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:30:55