如何使ggplot2中跨度不同的x轴刻度保持相等间距?
调整ggplot柱状图X轴刻度为等间距显示
我们使用的数据框如下:
df <- data.frame( n = c(0, 0, 0, 5, 5, 5, 100, 100, 100), y = c(1, 2, 1.5, NA, 2, 2.5, NA, 3, 4.5), f = c("i", "j", "k", "i", "j", "k", "i", "j", "k") )
原绘制柱状图的代码:
colors <- c("i" = "#1F1F1F", "j" = "#606060", "k" = "#B3B3B3") ggplot(data = df, aes(x = n, y = y, fill = f), show.legend = TRUE) + geom_bar(stat = "identity", position = "dodge", width = 3.5) + scale_fill_manual(values = colors, labels = c("i", "j", "k"), labs(title = "Title")) + theme_bw()
问题分析
当前X轴使用的是连续数值型的n,由于0、5、100的数值跨度极大,导致X轴刻度间距不均。要实现三个刻度等间距显示,本质是要把n当作分类变量而非连续变量处理。
解决方案
将n转换为因子(factor)类型,ggplot会自动将其视为等间距的分类轴。修改后的完整代码如下:
colors <- c("i" = "#1F1F1F", "j" = "#606060", "k" = "#B3B3B3") # 将n转为因子,指定顺序确保刻度按0、5、100排列 df$n <- factor(df$n, levels = c("0", "5", "100")) ggplot(data = df, aes(x = n, y = y, fill = f)) + geom_bar(stat = "identity", position = "dodge", width = 0.7, show.legend = TRUE) + scale_fill_manual(values = colors, labels = c("i", "j", "k")) + labs(title = "Title", x = "n") + theme_bw()
关键说明
- 把
n转为因子后,X轴的三个类别会自动等间距排列,无需再使用scale_x_continuous - 原代码中
show.legend = TRUE放在ggplot()参数里无效,需移至geom_bar()中或通过theme()设置 - 分类轴下的柱状图宽度建议调整为0.6-0.8,比连续轴的3.5更适配显示效果
如果不想修改原始数据框,也可以直接在aes中定义x = factor(n, levels = c(0,5,100)),效果一致。
内容的提问来源于stack exchange,提问作者user22965709
相关产品推荐
相关产品推荐

