如何解决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"))
解决建议
问题原因
- 多州筛选逻辑错误:使用
state == states匹配多个州时,R的向量匹配逻辑会导致筛选结果异常,无法正确选中所有目标州的数据。 - 冗余的均值计算:
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
相关产品推荐
相关产品推荐

