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)) )
原理说明
scale_y_reverse(limits = c(100, 0))维持了瀑布图的条形层级,确保各分段的堆叠方向正确- 通过
breaks指定轴刻度的位置,再用labels = rev(...)将显示的刻度值反转,让轴从左到右显示0, 20, ..., 100,匹配你的需求 - 这种方法不会改动图形的核心布局,只是修改了轴标签的显示内容
替代思路(手动构建瀑布图的修正)
如果你坚持手动用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
相关产品推荐
相关产品推荐

