R语言ggplot如何按变量调整柱宽 以变量累计值为X轴参考
解决方案
你当前用离散分类轴(国家作为x轴分类变量)的写法无法实现需求:geom_col在离散轴上的width是相对于分类间距的比例参数,无论怎么调整都无法完全消除分类自带的间隙,同时离散轴也无法直接映射连续的累计要素值。
正确实现思路是先预处理数据计算每个柱形的连续位置边界,用连续x轴绘制矩形条,步骤如下:
1. 数据预处理
先按quantity降序排序,再计算每个柱形的左右x轴边界:左边界为之前所有国家的elements累计值,右边界为到当前国家为止的elements累计值,保证柱形首尾完全衔接无空隙。
2. 绘图实现
用geom_rect绘制矩形柱形,直接映射连续边界值,x轴设置为连续刻度,按1000万为间隔生成断点即可。
完整可运行代码:
library(tidyverse) data <- data.frame("country" = c("Argentina", "Peru", "Bolivia", "French Guinea"), "quantity" = c(1.7, 2.2, 4.4, 4.3), "elements" = c(11030725, 1082704, 4827537, 12665)) # 数据预处理:排序+计算柱形边界 plot_data <- data %>% arrange(desc(quantity)) %>% # 按平均数量降序 mutate( xmax = cumsum(elements), # 柱形右边界:累计要素总数 xmin = lag(xmax, default = 0) # 柱形左边界:前一个柱的右边界 ) # 绘图 ggplot(plot_data) + # 用矩形绘制柱形,完全无间隙 geom_rect( aes(xmin = xmin, xmax = xmax, ymin = 0, ymax = quantity, fill = country), colour = "white" # 可选:加细白边区分不同国家的柱,不需要可删掉 ) + # 配置x轴:连续刻度,间隔1000万 scale_x_continuous( name = "累计要素总数量", breaks = seq(0, sum(data$elements), by = 10^7), # 1000万间隔断点 labels = ~ paste0(.x / 10^7, "千万"), # 标签格式化,不需要可删除该行保留原始数值 expand = c(0, 0) # 去掉x轴两端默认留白,保证轴终点对齐总要素数 ) + scale_y_continuous( name = "单个要素平均数量", expand = c(0, 0) # 可选:去掉y轴0点以下留白 )
效果说明
- 柱形宽度完全和
elements数值成正比,相邻柱形x边界完全衔接,没有任何空隙 - x轴为连续刻度,从0到全部要素总和,断点间隔为1000万,可根据需求调整
by参数修改间隔 - 如果不需要按国家区分颜色,删掉
geom_rect里的fill = country映射,加统一填充色参数即可,比如fill = "#2c7fb8"
内容的提问来源于stack exchange,提问作者nd091680
相关产品推荐
相关产品推荐

