如何在ggplot2中修改图例符号:Exp仅显示菱形,其余仅显示线条
ggplot2图例自定义:Exp仅显示菱形点、其他类别仅显示线条
我用ggplot2绘制的图表整体正常,但图例存在问题:Exp类别的图例同时显示菱形符号(shape=5)和黑色线条,而我希望Exp仅显示菱形符号(无线条),TL 1、TL 2、TL 3、TL 4、Model这些类别仅显示对应彩色线条。
原始代码
colors4 <- c("Exp" = "#000000", "TL 1" = "#56B4E9", "TL 2"="#CC79A7", "TL 3"="#009E73", "TL 4"="#D55E00", "Model"="#999999") ggplot(binodalbetla, aes(x=w.sal,y=w.tpc,colour=Category), show.legend=FALSE)+ geom_line(data=subset(binodalbetla,Category == "TL 1"),linewidth=1.2)+ geom_line(data=subset(binodalbetla,Category == "TL 2"),linewidth=1.2)+ geom_line(data=subset(binodalbetla,Category == "TL 3"),linewidth=1.2)+ geom_line(data=subset(binodalbetla,Category == "TL 4"),linewidth=1.2)+ geom_line(data=subset(binodalbetla,Category == "Model"),linewidth=1.2)+ geom_point(data=subset(binodalbetla,Category == "Exp"), aes(color="Exp"), size=2, shape=5)+ labs( x = expression(w[Salt]), y = expression(w[TPC]), title = bquote(Bet~":"~2~LA~"/"~K[3]~PO[4])) + scale_color_discrete(name="") + theme(panel.background = element_rect(fill = "white", colour = "grey50"), axis.text.x= element_text(face="bold", size=20), axis.text.y= element_text(face="bold", size=20), axis.text=element_text(size=34), axis.title.x = element_text(size=28), axis.title.y = element_text(size=28), title=element_text(size=34,face="bold"), legend.title= element_blank(), legend.text=element_text(size=30)) + ylim(0,1)+ scale_color_manual(values = colors4)
可复现数据集
binodalbetla <- structure(list(Category = c("Exp", "Exp", "Exp", "Exp", "Exp", "Exp", "Exp", "Exp", "Exp", "Exp", "Exp", "Exp", "Exp", "Exp", "TL 1", "TL 1", "TL 1", "TL 2", "TL 2", "TL 2", "TL 3", "TL 3", "TL 3", "TL 4", "TL 4", "TL 4", "Model", "Model", "Model", "Model", "Model", "Model", "Model", "Model", "Model", "Model", "Model", "Model", "Model", "Model"), w.sal = c(0.36964296, 0.35235401, 0.32564172, 0.30792464, 0.27185358, 0.25057568, 0.23468525, 0.19402343, 0.16116004, 0.13430737, 0.10794299, 0.08918584, 0.07037506, 0.04556309, 0.33234165, 0.45051932, 0.15453553, 0.29572918, 0.48062042, 0.06463047, 0.34704979, 0.50379819, 0.0438544, 0.29369441, 0.51158047, 0.03488902, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, 0.01, 0.011, 0.012, 0.013, 0.014, 0.015, 0.016), w.tpc = c(0.08997001, 0.111331692, 0.147805666, 0.170437196, 0.219397133, 0.247797606, 0.274395726, 0.385795245, 0.440709359, 0.494772301, 0.548779986, 0.594597503, 0.645092388, 0.702074353, 0.195207709, 0.025008216, 0.451284098, 0.298255159, 0.014280041, 0.653192383, 0.251874003, 0.008956064, 0.726794834, 0.348022565, 0.007416504, 0.752779981, 0.980858995, 0.964341288, 0.950018816, 0.937252593, 0.925663241, 0.915003704, 0.905102457, 0.895834667, 0.887106136, 0.878843704, 0.870989212, 0.863495518, 0.856323778, 0.849441)), class = "data.frame", row.names = c(NA, -40L))
解决方案
核心思路是通过guides()函数的override.aes参数,单独修改每个类别图例的显示属性:让Exp隐藏线条,其他类别隐藏点形状。同时简化原始代码的重复绘制逻辑:
library(ggplot2) library(dplyr) # 用于筛选数据,也可以用base R的subset colors4 <- c("Exp" = "#000000", "TL 1" = "#56B4E9", "TL 2"="#CC79A7", "TL 3"="#009E73", "TL 4"="#D55E00", "Model"="#999999") ggplot(binodalbetla, aes(x=w.sal, y=w.tpc, colour=Category)) + # 一次性绘制所有非Exp类别的线条 geom_line(data = filter(binodalbetla, Category != "Exp"), linewidth = 1.2) + # 绘制Exp类别的点,指定shape geom_point(data = filter(binodalbetla, Category == "Exp"), size = 2, shape = 5) + labs( x = expression(w[Salt]), y = expression(w[TPC]), title = bquote(Bet~":"~2~LA~"/"~K[3]~PO[4]) ) + # 自定义颜色映射 scale_color_manual(values = colors4) + # 调整图例显示:Exp只显示点,其他只显示线条 guides(color = guide_legend( override.aes = list( # 对应Category顺序:Exp, TL1, TL2, TL3, TL4, Model shape = c(5, NA, NA, NA, NA, NA), linewidth = c(0, 1.2, 1.2, 1.2, 1.2, 1.2) ) )) + theme( panel.background = element_rect(fill = "white", colour = "grey50"), axis.text.x = element_text(face="bold", size=20), axis.text.y = element_text(face="bold", size=20), axis.text = element_text(size=34), axis.title.x = element_text(size=28), axis.title.y = element_text(size=28), title = element_text(size=34, face="bold"), legend.title = element_blank(), legend.text = element_text(size=30) ) + ylim(0,1)
关键修改说明
- 简化线条绘制:用
filter(binodalbetla, Category != "Exp")一次性筛选所有非Exp数据,替代多次重复的geom_line调用,代码更简洁。 - 图例属性覆盖:
guide_legend(override.aes = ...)中,shape参数给Exp设置为5(菱形),其他类别设为NA(隐藏点);linewidth给Exp设为0(隐藏线条),其他类别保持1.2(显示线条)。 - 移除冗余代码:删除了冲突的
scale_color_discrete,因为已经使用scale_color_manual定义颜色映射。
内容的提问来源于stack exchange,提问作者David Moldes
相关产品推荐
相关产品推荐

