如何在ggplot中反转x轴breaks(刻度)的排列顺序
问题原因
在aes()中使用rev(Freq)仅对传入x轴映射的数值向量做倒序排列,未改变ggplot2连续轴默认「左小右大」的坐标映射规则。无论如何反转数据本身、调整breaks参数的排列顺序,连续轴始终会将最小数值放在最左侧、最大数值放在最右侧,因此会出现刻度间距异常、标签与实际位置不匹配的问题。
解决方案
不要在美学映射层反转数据,直接调用内置的轴反转函数即可实现x轴大值居左、小值居右的效果,只需将原scale_x_continuous()中的刻度、标签参数迁移到反转轴函数中即可,注意标签顺序要匹配反转后的轴位置。
修正后的可运行代码如下:
library(tidyverse) # 构造模拟数据(和原代码逻辑一致,无需修改) Freq <- rep(c(1, 2, 3, 5, 10, 15, 20), 10) SD <- c(rep(1, 7), rep(2, 7), rep(3, 7), rep(4, 7), rep(5, 7), rep(6, 7), rep(7, 7), rep(8, 7), rep(9, 7), rep(10, 7)) Intro_0 <- c(seq(80, 74, -1), seq(78, 72, -1), seq(76, 70, -1), seq(74, 68, -1), seq(72, 66, -1), seq(70, 64, -1), seq(68, 62, -1), seq(66, 60, -1), seq(64, 58, -1), seq(62, 56, -1)) test2 <- data.frame(cbind(Freq, SD, Intro_0)) # 修正后的绘图代码 ggplot(test2, aes(Freq, SD, z = Intro_0)) + # 直接传入原始Freq,无需rev()反转 geom_contour_filled(bins = 9)+ scale_fill_brewer(palette = "BuPu")+ labs(x="Frequency", y="Magnitude", title="Test Plot")+ # 调用反转连续轴函数,设置对应刻度和标签 scale_x_reverse( breaks = c(1, 2, 3, 5, 10, 15, 20), # 标签顺序匹配反转后轴位置:最右侧是1对应1/1,最左侧是20对应1/20 labels = c("Freq = 1/1", " ", " ", " ", " ", " ", "Freq = 1/20") )+ theme_bw()+ theme(panel.border = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.line = element_line(colour = "white"))+ theme(axis.text.x = element_text(angle = 45, hjust=1), plot.caption.position = "plot", plot.caption = element_text(hjust = 0))+ labs(fill="Legend")
补充说明
- 如果不想使用
scale_x_reverse(),也可以在scale_x_continuous()中添加参数trans = "reverse",两种写法效果完全等价。 - 轴反转后原最大值20会移动到最左侧,原最小值1会移动到最右侧,设置标签时需要对应调整顺序,避免刻度和标签含义错位。
内容的提问来源于stack exchange,提问作者MadelineJC
相关产品推荐
相关产品推荐

