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

R语言瀑布图:翻转坐标轴后保持x轴刻度范围0-100

解决方案

要实现limits = c(0, 100)的轴刻度显示,同时保持瀑布图的条形层级不变,可以通过反转刻度标签的方式实现,无需修改数据顺序或放弃scale_y_reverse():

data_fig <- data.frame(class = rev(c("Class A", "Class B", "Class C", "Other Classes")),
                       values = rev(c(15, 25, 50, 10)))

waterfalls::waterfall(
    .data = data_fig,
    rect_width = 0.7, 
    fill_by_sign = FALSE,
    put_rect_text_outside_when_value_below = FALSE,
    rect_border = NA,
    total_rect_border_color = NA,
    draw_axis.x = "none") +
    coord_flip() +
    scale_y_reverse(
        limits = c(100, 0),
        breaks = seq(0, 100, 20),
        labels = rev(seq(0, 100, 20))
    )

原理说明

  1. scale_y_reverse(limits = c(100, 0)) 维持了瀑布图的条形层级,确保各分段的堆叠方向正确
  2. 通过breaks指定轴刻度的位置,再用labels = rev(...)将显示的刻度值反转,让轴从左到右显示0, 20, ..., 100,匹配你的需求
  3. 这种方法不会改动图形的核心布局,只是修改了轴标签的显示内容

替代思路(手动构建瀑布图的修正)

如果你坚持手动用geom_rect/geom_segment构建,可以先计算每个条形的起始和结束位置,再在coord_flip()后直接设置scale_y_continuous(limits = c(0, 100)),关键是确保条形的y轴范围从0到累加值,而非反向:

# 计算累加值
data_fig$cumulative <- cumsum(data_fig$values)
data_fig$start <- c(0, head(data_fig$cumulative, -1))

ggplot(data_fig, aes(x = class)) +
    geom_rect(aes(ymin = start, ymax = cumulative, xmin = as.integer(class)-0.35, xmax = as.integer(class)+0.35), fill = "gray") +
    geom_text(aes(y = (start + cumulative)/2, label = values)) +
    coord_flip() +
    scale_y_continuous(limits = c(0, 100)) +
    theme(axis.title.x = element_blank(), axis.title.y = element_blank())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 06:22:28