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

如何用ggparcoord/ggplot绘制带分类标签的牛系谱平行坐标图

问题描述

需要创建牛系谱的平行坐标图,核心需求如下:

  • y轴显示所有唯一系谱编码(Breed及各Level列的文本标签)
  • x轴按原列顺序排列Breed及各Level列
  • 单条线条颜色保持一致,映射为Cow.Value评分
  • 额外要求:添加y轴次要网格线,按Cow.Value降序排列Breed(高分牛只位于y轴顶部)

此前尝试的问题:

  • 使用GGally::ggparcoord时,y轴显示数值而非系谱文本,无法追踪系谱关系
  • 使用geom_point + geom_path时,线条未显示(原因是未按单条系谱线分组)
解决方案

数据预处理与绘图思路

由于ggparcoord仅支持数值型y轴,改用ggplot基础图层实现:

  1. 给每条系谱记录添加唯一分组ID,确保geom_path能正确连接同一条系谱的点
  2. 自定义y轴顺序:先将Breed按Cow.Value降序排列,再补充其他系谱编码
  3. 转换数据为长格式,适配ggplot的绘图逻辑

完整代码

# 加载所需包
library(tidyverse)

# 读取提供的系谱数据
df <- read.csv(text = '"Cow.Value","Breed","Level.A","Level.B","Level.AA","Level.AB","Level.BA","Level.BB"
99,"GT 190089","AG 130024 HH(c)","AG 060290","AG 090751","HJB 030230","AG 010258","AG 010013"
110,"GT 190064","AG 130024 HH(c)","HCO 070086","AG 090751","HJB 030230","VV 030346","EI 980066"
95,"GT 190104","AG 150769 P","GT 150012","AG 130115 PP(c)","AG 130268","HCO 090066","HCO 060156"
118,"GT 190085","CEF 140311 HH(c)","NFS 070087","CEF 120367","CEF 080047","MMJ 000174","NFS 000255"
104,"GT 190067","LAR 150117 HH(c)","NFS 170004","BP 100017","LAR 120317","ABB 140515 HH(c)","NFS 140017"
104,"AG 200016","AG 140311","AG 120380","AG 110038","JMP 080335 P","AG 090082","AG 070232"
95,"GT 200035","AG 130024 HH(c)","GT 140013","AG 090751","HJB 030230","JL 070050","HCO 060020"
91,"GT 200012","AG 160401","AG 080720","AG 100080","AG 090489","AG 050085","AG 040247"
79,"GT 200010","JRP 120081","GT 160005","LAR 070055","JRP 010030","HCO 090066","DBP 090204"
87,"GT 200019","GT 160025","TOR 070207","GZV 140022","GZV 130082","TOR 050162","TOR 050012"
108,"GT 190059","AG 130024 HH(c)","NFS 140198","AG 090751","HJB 030230","NFS 090081","NFS 070324"
90,"AG 200024","AG 130147","AG 150871","AG 080210","AG 100156","AG 100080","AG 110728"
97,"GT 200032","AG 150769 P","GT 170036","AG 130115 PP(c)","AG 130268","FCT 120053","HKB 140073"
95,"GT 200020","LMR 130094","AG 060192","AG 100008","LMR 070093","LAR 000084","HJB 970042"
78,"LMR 200004","AG 090751","LMR 150145","CEF 040431","AG 980250","LMR 110036","LMR 070193"
92,"GT 190123","LMR 130094","CRV 150080","AG 100008","LMR 070093","CRV 120095","CRV 120075"
81,"GT 190119","JRP 120081","GT 160007","LAR 070055","JRP 010030","HCO 090066","DBP 090187"
89,"GT 190100","GT 160025","GT 170020","GZV 140022","GZV 130082","AEJ 130013","GZV 120177"
90,"GT 200013","AG 150769 P","HDE 150273","AG 130115 PP(c)","AG 130268","AG 110726","HDE 130099"
100,"GT 200043","AG 150769 P","TOR 170065","AG 130115 PP(c)","AG 130268","TOR 130174","TOR 090131"')

# 给每条系谱添加唯一ID,用于线条分组
df <- df %>% mutate(line_id = row_number())

# 转换为长格式数据
df_r <- df %>% 
  pivot_longer(cols = -c(Cow.Value, line_id), 
               names_to = "variable", values_to = "value")

# 自定义y轴顺序:Breed按Cow.Value降序,再补充其他系谱编码
breed_order <- df %>% arrange(desc(Cow.Value)) %>% pull(Breed)
other_values <- df_r %>% filter(!value %in% breed_order) %>% pull(value) %>% unique()
y_order <- c(breed_order, other_values)

# 将系谱编码转换为因子,指定y轴顺序
df_r <- df_r %>% mutate(value = factor(value, levels = y_order))

# 绘制平行坐标图
ggplot(df_r, aes(x = variable, y = value, color = Cow.Value)) +
  geom_point(size = 2) +
  # 按单条系谱分组绘制线条
  geom_path(aes(group = line_id), alpha = 0.7) +
  # 强制x轴按原列顺序排列
  scale_x_discrete(limits = c("Breed", "Level.A", "Level.B", "Level.AA", "Level.AB", "Level.BA", "Level.BB")) +
  # 使用渐变颜色映射评分
  scale_color_viridis_c(option = "plasma") +
  # 添加y轴次要网格线,优化主题样式
  theme_minimal() +
  theme(
    panel.grid.minor.y = element_line(color = "gray80", linetype = "dashed"),
    axis.text.y = element_text(size = 8),
    axis.title.y = element_text("系谱编码"),
    axis.title.x = element_text("世代层级")
  ) +
  labs(color = "Cow.Value评分")

关键说明

  • line_id的作用:为每条系谱记录提供唯一标识,确保geom_path能正确连接同一牛只的世代节点
  • y轴顺序自定义:通过提取Breed并按评分降序排列,实现高分牛只在y轴顶部的需求
  • x轴顺序控制:使用scale_x_discrete(limits = ...)强制x轴按原始列顺序展示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:50:22