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

ggplot箱线图:如何依据第三变量HEIGHT对X轴ST_CODE排序?

解决ggplot箱线图X轴按HEIGHT升序排列的问题

我之前也踩过这个坑!你直接在ggplot里排序数据没用,核心原因是ggplot是根据X轴变量的因子水平顺序来排列的,不是数据的行顺序。所以关键得把ST_CODE转换成因子,并且指定它的水平顺序为按HEIGHT升序对应的ST_CODE序列。

下面是具体的步骤和代码:

1. 加载必要的包

先确保你装了tidyverse(包含ggplot2和dplyr,处理数据+绘图一条龙):

library(tidyverse)

2. 读取并预处理数据

先读取数据集,然后调整ST_CODE的因子水平:

# 读取数据(假设你已经把csv文件下载到工作目录了)
ozone <- read.csv("ozone_example.csv")

# 获取按HEIGHT升序排列的ST_CODE顺序
# 这里默认每个ST_CODE对应唯一的HEIGHT,如果有重复值,用平均HEIGHT排序更稳妥
sorted_st_codes <- ozone %>%
  distinct(ST_CODE, HEIGHT) %>%  # 去重,保留每个ST_CODE对应的HEIGHT
  arrange(HEIGHT) %>%            # 按HEIGHT升序排序
  pull(ST_CODE)                  # 提取排序后的ST_CODE序列

# 将ST_CODE转换为因子,指定水平顺序为上面得到的序列
ozone$ST_CODE <- factor(ozone$ST_CODE, levels = sorted_st_codes)

3. 绘制箱线图

现在再用ggplot绘图,X轴就会自动按HEIGHT的升序排列了:

ggplot(ozone, aes(x = ST_CODE, y = VALUE)) +
  geom_boxplot(fill = "#4292c6", alpha = 0.7) +  # 加个颜色让图更直观
  labs(
    x = "站点代码(按高度升序)",
    y = "VALUE数值",
    title = "各站点VALUE的箱线图"
  ) +
  theme_minimal()

为什么之前的方法没用?

你之前用ozone[order(ozone$HEIGHT),]只是把数据行按HEIGHT排序了,但ST_CODE还是字符型或者默认的因子水平(按字母顺序),ggplot绘制时还是会遵循X轴变量本身的默认顺序,所以不会改变X轴排列。只有修改ST_CODE的因子水平,才能强制ggplot使用你想要的顺序。

如果你的数据里同一个ST_CODE对应多个HEIGHT值,那可以用每个ST_CODE的平均HEIGHT来排序,代码调整如下:

sorted_st_codes <- ozone %>%
  group_by(ST_CODE) %>%
  summarise(avg_height = mean(HEIGHT)) %>%  # 计算每个ST_CODE的平均高度
  arrange(avg_height) %>%
  pull(ST_CODE)

这样就能完美解决你的问题啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:36:02