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

如何绘制分组Cleveland图以对比不同性别各年龄段行为概率

解决Cleveland图表双性别对比问题

核心方案

你的问题根源在于宽格式数据不适合多组对比,以及直接偏移离散x轴时的类型冲突。以下是分步解决方法:

1. 数据预处理(宽转长)

先把当前的宽格式数据转换为适合ggplot2绘图的长格式,拆分出年龄、性别字段:

library(tidyverse)

# 宽转长并拆分年龄与性别
data_long <- Data %>%
  pivot_longer(
    cols = -skill,
    names_to = "age_gender",
    values_to = "probability"
  ) %>%
  separate(age_gender, into = c("age", "gender"), sep = 2) %>%
  mutate(age = as.numeric(str_remove(age, "age")))

处理后每行对应一个技能、年龄、性别和概率,方便后续分组操作。

2. 解决x轴偏移报错

skill是离散变量,直接偏移会触发类型错误。我们可以把离散技能转换为数值ID,再给男女设置不同偏移量,最后还原轴标签:

# 给技能分配数值ID
skill_levels <- unique(data_long$skill)
data_long <- data_long %>%
  mutate(skill_num = match(skill, skill_levels))

# 设置偏移量(可根据需求调整大小)
offset <- 0.2
data_long <- data_long %>%
  mutate(skill_num_adjust = ifelse(gender == "male", skill_num - offset, skill_num + offset))

3. 绘制双性别Cleveland图表

使用ggplot2实现对比,配置颜色渐变与图例:

ggplot(data_long, aes(x = skill_num_adjust, y = age, color = probability)) +
  geom_point(size = 3) +
  # 配置统一颜色渐变
  scale_color_gradient(
    name = "表现概率",
    low = "#e0f7fa",
    high = "#006064"
  ) +
  # 还原x轴离散标签
  scale_x_continuous(
    breaks = seq_along(skill_levels),
    labels = skill_levels,
    name = "技能类型"
  ) +
  # 添加辅助线区分男女位置
  geom_vline(xintercept = seq_along(skill_levels), linetype = "dashed", alpha = 0.3) +
  # 贴合Cleveland图表风格的主题调整
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "right"
  ) +
  labs(y = "年龄", title = "不同性别各年龄段技能表现概率对比")

4. 独立颜色渐变与图例(进阶)

如果需要男女使用完全独立的颜色渐变和图例,可借助ggnewscale包实现双颜色标尺:

# 先安装包:install.packages("ggnewscale")
library(ggnewscale)

ggplot() +
  # 男性数据层
  geom_point(data = filter(data_long, gender == "male"), 
             aes(x = skill_num - offset, y = age, color = probability), size = 3) +
  scale_color_gradient(name = "男性概率", low = "#bbdefb", high = "#1976d2") +
  # 开启新的颜色标尺
  new_scale_color() +
  # 女性数据层
  geom_point(data = filter(data_long, gender == "female"), 
             aes(x = skill_num + offset, y = age, color = probability), size = 3) +
  scale_color_gradient(name = "女性概率", low = "#f8bbd0", high = "#c2185b") +
  # 还原x轴标签
  scale_x_continuous(breaks = seq_along(skill_levels), labels = skill_levels, name = "技能类型") +
  geom_vline(xintercept = seq_along(skill_levels), linetype = "dashed", alpha = 0.3) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(y = "年龄", title = "不同性别各年龄段技能表现概率对比")

关键注意事项

  • 偏移量offset需根据x轴间距调整,避免点重叠
  • 离散转数值的处理是解决"Discrete value supplied to continuous scale"报错的核心
  • ggnewscale是实现多独立颜色标尺的常用工具,需提前安装

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:18:25