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

如何修正ggplot2双轴折线图的图例线型对应名称

修正ggplot2双轴折线图的图例线型与标签对应关系

你当前的代码中,图例的线型与标签对应关系和实际绘图不符:图例显示虚线对应"Magnesio"、实线对应"Hierro",但你需要虚线对应"Hierro"、实线对应"Magnesio"。可以通过以下两种方式解决:

方式一:规范线型映射(推荐)

这种方式将线型与元素名称绑定,逻辑更清晰、后续更易维护:

  1. 修改geom_line中的linetype映射,从直接指定线型改为绑定元素名称:
# eje y izquierdo: hierro
geom_line(
    aes(y = Media_Fe,
        group = 1, 
        color = "Hierro",
        linetype = "Hierro"  # 改为元素名称
    ), 
    size = 0.8) + 
# ...
# eje y derecho: magnesio
geom_line(
    aes(y = Media_Mg * escala_factor, 
        group = 1, 
        color = "Magnesio",
        linetype = "Magnesio"  # 改为元素名称
    ), size = 0.8) + 
  1. 添加scale_linetype_manual来指定每个元素对应的线型,同时定义图例:
scale_linetype_manual(
    name = "Elemento",
    values = c("Hierro" = "dashed", "Magnesio" = "solid")  # 指定Hierro用虚线,Magnesio用实线
) +
  1. 删除原来的guides(linetype = guide_legend(...))代码块,因为scale_linetype_manual已经完成了图例的配置。

方式二:直接修改现有guides参数

如果不想调整整体映射逻辑,仅修改图例的对应关系,可以直接修改guides中的参数:

将原来的:

guides(
    linetype = guide_legend(
      title = "Elemento", 
      labels = c("Magnesio", "Hierro"),
      values = c("Magnesio" = "dashed", "Hierro" = "solid"),
    ))

替换为:

guides(
    linetype = guide_legend(
      title = "Elemento", 
      labels = c("Hierro", "Magnesio"),  # 调整标签顺序,先显示Hierro(虚线)
      values = c("dashed", "solid")  # 对应线型:虚线、实线
    ))

修改后的完整代码(方式一)

#data
datos_graficos <- data.frame(
  Arena = c(20,25,30,35,40,45,50),
  Media_Mg = c(0.3050000,0.3025000,0.2775000,0.3157143,0.2887500,0.2928571,0.3225000),
  SE_Mg = c(0.02160155,0.02160155,0.02160155,0.02309303,0.02160155,0.02309303,0.02160155),
  Rangos_Mg = c("a","a","a","a","a","a","a"),
  Media_Fe = c(27.00000,30.25000,68.87500,67.42857,85.12500,63.42857,71.25000),
  SE_Fe =c(11.60294,11.60294,11.60294,12.40406,11.60294,12.40406,11.60294),
  Rangos_Fe = c("b","bc","a","a","a","ab","a")
)

#plotting in ggplot2
escala_factor <- max(datos_graficos$Media_Fe)/max(datos_graficos$Media_Mg)#variable de la izquierdo/derecho

library(ggplot2)
library(ggrepel)
ggplot(datos_graficos, aes(x = Arena)) +
  #eje y izquierdo: hierro
  geom_line(
    aes(y = Media_Fe,
        group = 1, 
        color = "Hierro",
        linetype = "Hierro"
    ), 
    size = 0.8) + 
  geom_point(
    aes(y = Media_Fe, color = "Hierro"), 
    size = 2) + #puntos para hierro
  geom_text_repel(
    aes(y = Media_Fe, label = Rangos_Fe),
    color = "black", size = 3) + #letras para hierro
  geom_errorbar(
    aes(y = Media_Fe, 
        ymin = Media_Fe - SE_Fe, 
        ymax = Media_Fe + SE_Fe, 
        color = "Hierro"), 
    width = 0.2, size = 0.5) + #barras de error para Hierro
  #eje y derecho: magnesio
  geom_line(
    aes(y = Media_Mg * escala_factor, 
        group = 1, 
        color = "Magnesio",
        linetype = "Magnesio"
    ), size = 0.8) + #linea para magnesio
  geom_point(
    aes(y = Media_Mg * escala_factor, 
        color = "Magnesio"), 
    size = 2) + #puntos para magnesio
  geom_text_repel(
    aes(y = Media_Mg * escala_factor,
        label = Rangos_Mg), 
    color = "black", size = 3) + #letras para magnesio
  geom_errorbar(
    aes(y = Media_Mg * escala_factor,
        ymin = Media_Mg * escala_factor - SE_Mg * escala_factor, 
        ymax = Media_Mg * escala_factor + SE_Mg * escala_factor, 
        color = "Magnesio"), 
    width = 0.2, size = 0.5) + #barras de error para magnesio
  scale_y_continuous(
    name = "Hierro (mg/kg)", #eje y izquierdo
    sec.axis = sec_axis(#eje y derecho
      ~./escala_factor, name = "Magnesio (%)",
    ),
    limits = c(0, 100)) + #limites al eje y izquierdo
  labs(x = "Arena (%)") +
  #leyenda
  scale_color_manual(
    values = c("Hierro" = "black", "Magnesio" = "black"),
    guide = "none") +
  # 新增的线型映射配置
  scale_linetype_manual(
    name = "Elemento",
    values = c("Hierro" = "dashed", "Magnesio" = "solid")
  ) +
  theme(
    axis.title.y = element_text(size = 12),
    axis.title.y.right = element_text(size = 12,color="black"),
    axis.text = element_text(size = 12),
    legend.key.width = unit(1, 'cm'), 
    legend.text = element_text(size = 14), 
    axis.title.y.left=element_text(color="black"),
    axis.text.y.left=element_text(color="black"),
    axis.text.y.right=element_text(color="black"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:35:55