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

ggplot2绘图问题:设置非均值线为虚线及图例排序调整

解决ggplot2绘图的两个问题

问题1:设置非均值线为虚线并同步图例样式

原代码中linetype="dashed"是固定值而非映射,导致图例无法同步显示虚线样式。需要将linetype与pat关联,通过scale_linetype_manual指定线型规则。

问题2:调整图例顺序

通过统一各美学映射的图例名称,并在scale_*_manual中设置breaks参数指定顺序,即可控制图例项的排列。

修改后的完整代码

# 加载必要包
library(ggplot2)
library(viridis)
library(latex2exp)

# 颜色设置
all_pats <- c("Mean", unique(df$pat))
num_patterns <- length(all_pats)
color_palette <- viridis(num_patterns, option = "A")

# 优化均值计算(替代原循环)
result_df <- aggregate(changes ~ sc, df, mean)
result_df$pat <- "Mean"

# 绘图
ggplot(df, aes(x = sc, y = changes, color = pat, shape = pat, linetype = pat)) +
  geom_line(alpha = 0.3) +
  geom_line(data = result_df, size = 0.6) +
  xlab(TeX("$SC_{Max}$")) +
  ylab("Relative Understaffing %") +
  # 颜色映射,指定图例顺序
  scale_color_manual(
    values = color_palette,
    name = "Pattern",
    breaks = c("Mean", unique(df$pat)) # Mean放在最前面,其余按原顺序
  ) +
  # 形状映射,仅Mean显示形状,其他设为NA
  scale_shape_manual(
    values = c(Mean = 16, rep(NA, length(unique(df$pat)))),
    name = "Pattern"
  ) +
  # 线型映射,Mean实线,其余虚线
  scale_linetype_manual(
    values = c(Mean = "solid", rep("dashed", length(unique(df$pat)))),
    name = "Pattern",
    breaks = c("Mean", unique(df$pat))
  )

关键修改说明

  1. 线型映射:将linetype加入全局aes,通过scale_linetype_manual明确指定Mean为实线,其他pattern为虚线,图例会自动同步显示对应线型。
  2. 图例合并与顺序:统一color、shape、linetype三个美学映射的name为"Pattern",让ggplot合并为一个图例;通过breaks参数将"Mean"放在图例最前列,其余项按原顺序排列(可自定义breaks向量调整顺序)。
  3. 数据优化:用aggregate替代循环计算均值,代码更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:53:15