如何在R语言ggplot2中使用多列数据作为X轴取值
解决方案
ggplot2默认基于长格式数据进行映射,你需要先将存储多组数值的宽表转为长表,同时修正原代码的几处语法错误,示例代码如下:
# 加载依赖包 library(tidyverse) # 构造基础数据,修正原代码中loc向量缺失的逗号 blue <- c(83, 81, 80, 71, 69, 63, 63, 62, 54) red <- c(112, 96, 111, 141, 125, 89, 178, 107, 130) loc <- c("YISHUN", "WOODLANDS", "HOUGANG", "ANG MO KIO", "TAMPINES", "SENGKANG", "GEYLANG", "BEDOK", "JURONG WEST") # 构建数据框并转为长格式 df <- tibble(loc, blue, red) %>% pivot_longer(cols = c(blue, red), names_to = "group", values_to = "value") # 绘制哑铃图 ggplot(df, aes(y = loc)) + # 连线直接用原始宽表的两列作为起止值 geom_segment(aes(x = blue, xend = red, yend = loc), data = tibble(loc, blue, red), color = "gray") + # 点按分组上色 geom_point(aes(x = value, color = group), size = 3) + # 自定义颜色匹配需求 scale_color_manual(values = c("blue" = "blue", "red" = "red")) + labs(x = "数值", y = "区域", color = "分组")
核心原理说明
- 你遇到的多列无法直接映射为X轴的问题,本质是ggplot2的美学映射要求每个维度对应数据框的单独一列:如果要把
blue和red两组值作为同一X轴下的不同分组,需要通过长宽转换把两组值合并到同一列,额外新增一列标注分组归属。 - 连线的
geom_segment可以直接引用原始宽表的两列作为X轴的起止值,不需要额外转换。
内容的提问来源于stack exchange,提问作者Disdainty
相关产品推荐
相关产品推荐

