R-ggplot2:如何将柱状图stop_out变量置于y轴负侧、stop_in保留在正侧
解决方案
你只需要在数据整理步骤中将stop_out对应的数值转为负数,即可实现下车人数展示在y轴负半轴、上车人数保留在正半轴的效果,也可以额外调整y轴刻度标签让负半轴显示绝对值,更符合业务阅读习惯。
修改后完整代码如下:
library(tidyr) library(dplyr) library(ggplot2) tramway_df <- data.frame( stop_order = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17), stop_id = c(9943, 5041, 5361, 2902, 2903, 5872, 5802, 5803, 5804, 5805, 5710, 5711, 5712, 1643, 5714, 521, 529), stop_name = c("DA VINCI", "DA VINCI", "BORDET STATION", "VAN CUTSEM", "FONSON", "PAIX", "TILLEUL", "HELMET", "FOYER SCHAERBEEK.", "WAELHEM", "VERBOEKHOVEN", "PAVILLON", "RUBENS", "LIEDTS", "THOMAS", "GARE DU NORD", "ROGIER"), stop_in = c(27, 102, 153, 141, 190, 317, 379, 438, 328, 214, 278, 298, 154, 144, 162, 185, 0), stop_out = c(0, 7, 3, 10, 22, 37, 81, 122, 143, 168, 291, 230, 149, 301, 412, 707, 821), stop_charge = c(27, 121, 271, 402, 571, 851, 1149, 1465, 1650, 1696, 1682, 1745, 1750, 1592, 1342, 821, 0) ) tramway_df %>% gather(movement, value, stop_in:stop_out) %>% mutate(stop_id = factor(stop_id, levels = unique(stop_id)), # 核心修改:将下车人数转为负值,自动渲染到y轴负半轴 value = ifelse(movement == "stop_out", -value, value)) %>% ggplot(aes(x=stop_id)) + geom_col(aes(y=value, fill = movement), width = 0.7) + geom_line(aes(y=stop_charge, group=1), color = "black") + scale_x_discrete(breaks = tramway_df$stop_id, labels = tramway_df$stop_name) + # 优化:y轴刻度显示绝对值,避免负号误导 scale_y_continuous(labels = abs, name = "人数") + # 优化:调整图例名称,适配中文阅读 scale_fill_discrete(labels = c("上车人数", "下车人数"), name = "客流类型") + # 优化:x轴标签倾斜避免重叠 theme(axis.text.x = element_text(angle = 45, hjust = 1))
修改说明
- 核心逻辑是通过条件判断将
stop_out的数值转为负数,ggplot会自动把负值柱状图绘制在y轴负半轴 - 如果需要上下车的柱子在x轴同一位置左右并列,只需把
geom_col的参数改回position = "dodge"即可 - 后面的y轴、图例、主题调整都是优化项,如果不需要可以直接删除,不影响核心效果
内容的提问来源于stack exchange,提问作者salwa
相关产品推荐
相关产品推荐

