如何修正ggplot2双轴折线图的图例线型对应名称
修正ggplot2双轴折线图的图例线型与标签对应关系
你当前的代码中,图例的线型与标签对应关系和实际绘图不符:图例显示虚线对应"Magnesio"、实线对应"Hierro",但你需要虚线对应"Hierro"、实线对应"Magnesio"。可以通过以下两种方式解决:
方式一:规范线型映射(推荐)
这种方式将线型与元素名称绑定,逻辑更清晰、后续更易维护:
- 修改
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) +
- 添加
scale_linetype_manual来指定每个元素对应的线型,同时定义图例:
scale_linetype_manual( name = "Elemento", values = c("Hierro" = "dashed", "Magnesio" = "solid") # 指定Hierro用虚线,Magnesio用实线 ) +
- 删除原来的
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
相关产品推荐
相关产品推荐

