使用ggplot2绘制Connected Scatterplot时无连接线的原因排查
问题描述
我尝试用以下R代码绘制连接散点图,但运行自有数据时,图表中的点之间未显示连接线,求分析原因。
使用代码
library(hrbrthemes) df_long %>% tail(50) %>% ggplot( aes(x=YEAR, y=value)) + geom_line( color="grey") + geom_point(shape=21, color="black", fill="#69b3a2", size=6) + theme_ipsum() + ggtitle("Evolution of prices")
数据结构
structure(list(YEAR = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 8L, 9L, 9L, 10L, 10L, 11L, 11L, 12L, 12L, 13L, 13L, 14L, 14L, 15L, 15L, 16L, 16L, 17L, 17L, 18L, 18L, 19L, 19L), levels = c("2003", "2004", "2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021"), class = "factor"), names = c("avg_2", "avg_1", "avg_2", "avg_1", "avg_2", "avg_1", "avg_2", "avg_1", "avg_2", "avg_1", "avg_2", "avg_1", "avg_2", "avg_1", "avg_2", "avg_1", "avg_2", "avg_1", "avg_2", "avg_1", "avg_2", "avg_1", "avg_2", "avg_1", "avg_2", "avg_1", "avg_2", "avg_1", "avg_2", "avg_1", "avg_2", "avg_1", "avg_2", "avg_1", "avg_2", "avg_1", "avg_2", "avg_1"), value = c(9.24465000408397, 10.8283582089552, 9.61375824446773, 11.4962264150943, 9.57910257217093, 9.97674418604651, 9.55737818803894, 9.93948562783661, 9.66620683746037, 9.7574931880109, 10.0840478564307, 10.0276381909548, 11.0876717354968, 11.4456824512535, 11.3436795117236, 11.6129476584022, 12.9319600743713, 11.7403314917127, 13.4045649811086, 12.5052631578947, 12.5327230426866, 12.6259079903148, 13.1406016392921, 12.4209844559585, 12.6763227410025, 12.3654114365411, 12.9536953727506, 12.3433734939759, 12.9377914217035, 12.4618644067797, 13.6294270858362, 12.3377483443709, 14.5345731090248, 13.3298245614035, 14.6696202531646, 14.1116005873715, 16.6562338726815, 15.1701030927835)), row.names = c(NA, -38L), class = c("tbl_df", "tbl", "data.frame"))
原因分析与解决办法
核心原因
你的数据中每个YEAR对应两条记录(分属avg_1和avg_2),但geom_line()默认会尝试连接同x值的点,而非跨年份的同分组点。由于没有指定分组依据,函数无法识别哪些点属于同一序列,因此无法画出预期的年度连接线。另外,YEAR是因子类型,虽不影响连接逻辑,但转为数值型能让x轴显示更合理。
修复方案(区分两组数据)
通过group参数指定按names分组,让geom_line()分别为avg_1和avg_2绘制年度连接线,同时将YEAR转为数值型:
library(hrbrthemes) library(dplyr) df_long %>% tail(50) %>% mutate(YEAR = as.numeric(as.character(YEAR))) %>% ggplot(aes(x = YEAR, y = value, group = names, color = names)) + geom_line() + geom_point(shape = 21, color = "black", fill = "#69b3a2", size = 6) + theme_ipsum() + ggtitle("Evolution of prices") + scale_color_manual(values = c("avg_1" = "grey", "avg_2" = "darkslategrey"))
替代方案(合并两组数据)
如果不需要区分avg_1和avg_2,可以先按年份聚合value(比如取均值),再绘制整体趋势线:
library(hrbrthemes) library(dplyr) df_long %>% tail(50) %>% mutate(YEAR = as.numeric(as.character(YEAR))) %>% group_by(YEAR) %>% summarise(value = mean(value)) %>% ggplot(aes(x = YEAR, y = value)) + geom_line(color = "grey") + geom_point(shape = 21, color = "black", fill = "#69b3a2", size = 6) + theme_ipsum() + ggtitle("Evolution of prices")
内容的提问来源于stack exchange,提问作者Espejito
相关产品推荐
相关产品推荐

