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

如何反转ggplot热图Y轴类别标签的显示顺序?

解决ggplot热图Y轴分类顺序与标签匹配问题

你遇到的核心问题是直接在aes()里用rev(class)会同时反转数据的分类值和轴标签,导致标签顺序不符合预期。正确的做法是通过调整轴的显示规则来实现布局需求,同时保持标签与数据的对应关系。

以下是两种可行方案:

方案一:通过scale_y_discrete反转轴顺序(推荐)

不需要修改原始数据的分类,直接在绘图时指定Y轴的显示顺序,这样既实现了高等级class在底部的布局,又保证标签与数据对应:

library(tidyverse)

# 构建数据
m <- tibble(class = 1:4,
            Jan = c(0,0,1,4),
            Feb = c(0,1,3,2),
            Mar = c(1,3,1,0)) %>% 
  mutate(class = factor(class))

# 重塑数据
ts <- m %>% 
  gather(month, count, Jan:Mar) %>% 
  mutate(month = factor(month, levels = month.abb))

# 绘制热图
ggplot(ts, aes(x = month, y = class, fill = count)) +
  geom_tile() +
  scale_fill_distiller(palette = "Blues", direction = 1) +
  scale_y_discrete(limits = rev(levels(ts$class))) +  # 反转Y轴的显示顺序
  theme_bw()

这段代码中,scale_y_discrete(limits = rev(levels(ts$class)))会将Y轴的分类顺序反转,让class=4(高降雨等级)显示在底部,同时标签保持为4、3、2、1,与实际数据一一对应。

方案二:提前修改因子水平

如果希望在数据处理阶段就固定分类顺序,可以直接修改class的因子水平:

# 重塑数据时同时调整class的因子水平
ts <- m %>% 
  gather(month, count, Jan:Mar) %>% 
  mutate(month = factor(month, levels = month.abb),
         class = factor(class, levels = rev(1:4)))  # 反转因子水平

# 直接绘图,无需额外调整轴
ggplot(ts, aes(x = month, y = class, fill = count)) +
  geom_tile() +
  scale_fill_distiller(palette = "Blues", direction = 1) +
  theme_bw()

这种方式的效果和方案一完全一致,优势是后续绘图无需重复设置轴规则。

注意:如果你确实需要标签显示为1、2、3、4但class=4在底部(不推荐,会导致标签与数据不匹配),可以在scale_y_discrete中自定义标签:

scale_y_discrete(limits = rev(levels(ts$class)), labels = levels(ts$class))

但这种做法会让标签1对应class=4的数据,容易造成误解,建议优先使用前两种方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:36:00