You need to enable JavaScript to run this app. 如何用ggplot2基于多列数据在单张图中绘制可区分来源的点图
优惠活动
大模型
产品
解决方案
定价
更多

如何用ggplot2基于多列数据在单张图中绘制可区分来源的点图

目标绘图的实现方案

核心逻辑

当前的宽格式数据无法直接为每个点绑定所属标记列的属性,需要先将A.、B.、C.、D.四列的宽表结构转为长格式,筛选出标记值为1的记录,再通过颜色、形状的视觉编码区分不同来源的点。

分步实现

  1. 加载依赖包并完成数据格式转换
library(dplyr)
library(tidyr)
library(ggplot2)
library(hrbrthemes) # 提供theme_ipsum主题支持

# 宽表转长表,筛选需要绘点的记录
df_long <- df %>%
  pivot_longer(
    cols = c(A., B., C., D.),
    names_to = "Source", # 新增列存储标记列来源
    values_to = "Flag"   # 新增列存储原0/1标记值
  ) %>%
  filter(Flag == 1) # 仅保留标记值为1的行,即需要绘点的记录

转换完成后,每行对应一个需要绘制的点,自动携带该点来自A./B./C./D.哪一列的信息。例如原表中Q8WZ42的四个标记列取值全为1,转长表后会生成4行独立记录。
2. 调整绘图逻辑,增加来源区分的视觉编码

ggplot(df_long, aes(x = Value, y = Entry, color = Source, shape = Source)) +
  geom_point(
    size = 2,
    # 仅在y轴方向加极小幅位置偏移,避免同个Entry下的点完全重叠
    position = position_jitter(width = 0, height = 0.12)
  ) +
  theme_ipsum() +
  # 手动指定每个来源对应的颜色、形状,提升辨识度
  scale_color_manual(
    values = c("A." = "#1f77b4", "B." = "#ff7f0e", "C." = "#2ca02c", "D." = "#d62728")
  ) +
  scale_shape_manual(
    values = c("A." = 16, "B." = 17, "C." = 15, "D." = 18)
  )

关键说明

  • 同个Entry下所有待绘制的点,x值固定为该Entry对应的Value、y值固定为Entry名称,若不加极小幅y方向偏移,所有点会完全叠在同一个位置,无法分辨数量和来源。代码中抖动的y偏移幅度很小,不会破坏Entry和y轴的对应关系。
  • 同时使用颜色+形状双重编码区分来源,即便图片转为黑白印刷场景,也能通过形状识别不同标记列的来源,比单靠颜色的区分度更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 07:15:03