R ggplot2 geom_line绘制分组折线异常为粗条问题排查
异常原因
- 核心错误是
geom_line()的美学映射中设置了group = 1:group参数是ggplot用来指定折线分组的依据,设置为1等于强制将所有数据点归为同一组,即使你已经用color=Item映射了商品类别,ggplot也会忽略分类规则,把所有点按x轴顺序连为同一条线,再搭配你设置的size=8的超粗线宽,自然会呈现形态怪异的粗条。 - 初始代码未对
Date列做类型转换:用read.table读入的日期列默认是字符型,x轴会被识别为离散分类变量,点的连接顺序会按数据框中的行顺序排列,进一步加剧线条错乱。就算你后续用lubridate::mdy(Date)把x轴转成了日期类型,只要group=1的设置没删除,三个品类的点依然会被归为同一组连接,就会出现你补充截图里的交叉乱线。
修正方案
- 删除
aes()内的group = 1参数:只要映射了color=Item这类分类属性,ggplot会自动按Item的取值拆分分组,为Fruit、Confectionary、Appliance三个类别分别绘制独立折线。 - 保留
Date列的日期类型转换,让x轴按连续时间尺度展示,避免离散轴的排序问题。 - 调小线宽参数,
size=8的线宽过粗,正常折线图线宽设置为0.5~1.5即可。
修正后的可运行代码:
library(ggplot2) library(lubridate) # 构造示例数据 df <- read.table(text="Date Item Purchased 01/01/08 Fruit 48 01/01/08 Confectionary 42 01/01/08 Appliance 11 01/06/08 Confectionary 16 01/06/08 Fruit 19 01/06/08 Appliance 50", header=TRUE) # 绘图 test_df <- ggplot(df) + geom_line(aes(x = mdy(Date), y = Purchased, color = Item), linewidth = 1) + theme( title = element_text(size = 10), panel.background = element_rect(fill = 'white', color = "grey70"), legend.position = 'top' ) test_df
注:ggplot2 3.4.0及以上版本中,折线的宽度参数推荐使用
linewidth,老版本可换回size参数。
内容的提问来源于stack exchange,提问作者alec22
相关产品推荐
相关产品推荐

