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

如何在ggplot2的geom_col柱状图中添加geom_smooth平滑线?

在ggplot2柱状图(分类x轴)中添加趋势线的解决方案

可以实现!核心思路是将已排序的分类变量转换为连续的数值索引,以此作为趋势线拟合的底层x变量,同时保留原分类标签作为x轴显示。

步骤与代码示例

1. 准备并排序数据集

假设你的数据集如下(模拟你提供的dput):

df <- structure(list(category = c("A", "B", "C", "D", "E"), value = c(10, 15, 22, 28, 35)), class = "data.frame", row.names = c(NA, -5L))

先按y轴数值升序排序分类变量,并添加连续数值列(对应分类的位置):

library(ggplot2)

# 按y值升序排序,固定分类变量的顺序
df_sorted <- df[order(df$value), ]
df_sorted$category <- factor(df_sorted$category, levels = df_sorted$category)
# 添加连续数值列,用于拟合趋势线
df_sorted$x_num <- seq_along(df_sorted$category)

2. 绘制柱状图+拟合趋势线

使用geom_smooth拟合模型趋势线(比如线性回归):

ggplot(df_sorted, aes(y = value)) +
  # 绘制柱状图,用x_num作为底层x变量
  geom_col(aes(x = x_num), fill = "#2E8B57", width = 0.7) +
  # 添加趋势线,基于连续的x_num拟合
  geom_smooth(aes(x = x_num), method = "lm", se = FALSE, color = "#FF6347", linewidth = 1) +
  # 将x轴刻度替换为原分类标签
  scale_x_continuous(breaks = df_sorted$x_num, labels = df_sorted$category) +
  labs(x = "分类变量", y = "数值") +
  theme_minimal()

3. 备选:添加简单连接趋势线

如果不需要拟合模型,只想连接每个柱子的顶端,用geom_line即可:

ggplot(df_sorted, aes(x = x_num, y = value)) +
  geom_col(fill = "#2E8B57", width = 0.7) +
  geom_line(color = "#FF6347", linewidth = 1, group = 1) +
  geom_point(color = "#FF6347", size = 2) +
  scale_x_continuous(breaks = df_sorted$x_num, labels = df_sorted$category) +
  labs(x = "分类变量", y = "数值") +
  theme_minimal()

关键说明

  • 因为你的分类变量已经按y值升序排序,转换为连续数值索引后,趋势线能准确反映数据的变化趋势
  • geom_smooth的method参数可按需调整:lm对应线性趋势,loess对应非线性局部趋势
  • scale_x_continuous保证x轴显示的仍是原分类标签,不影响可读性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:22:00