如何在ggplot中设置指定分组为黑色实线、其余为虚线并配置图例?
问题描述
我有一个data frame,希望将diff=0.3对应的线条设置为黑色实线,其余所有线条设置为虚线,同时让图例能够正确呈现该设置。我尝试在aes()中添加linetype=diff==0.3但未成功,相关代码如下:
df <- data.frame(delta=c(0,0.1,0.2,0.3,0.4,0.5,0,0.1,0.2,0.3,0.4,0.5,0,0.1,0.2,0.3,0.4,0.5,0,0.1,0.2,0.3,0.4,0.5), Pct=c(0.676,0.268,0.08,0.008,0,0,0.58,0.266,0.088,0.026,0.002,0,0.672,0.262,0.082,0.036,0.004,0,0.642,0.264,0.122,0.02,0.006,0), diff = as.character(c(0.1,0.1,0.1,0.1,0.1,0.1,0.2,0.2,0.2,0.2,0.2,0.2,0.3,0.3,0.3,0.3,0.3,0.3,0.4,0.4,0.4,0.4,0.4,0.4))) df$Pct=as.numeric(df$Pct) df$delta=as.numeric(df$delta) df$diff=as.character(df$diff) p <- ggplot(data=df, aes(x = delta, y = Pct, col = diff))+ geom_point() + geom_smooth(data=df, se=F, span=2,na.rm = TRUE) + labs(title = "title", x="x axis",y="y axis")+ scale_color_manual(name="percentage", breaks=as.character(seq(0.1,0.4,0.1)), labels=as.character(seq(0.1,0.4,0.1)), values=c("red","blue","black","pink")) + scale_y_continuous(breaks = seq(0, 1, 0.1), limits = c(0, 1))+ scale_x_continuous(breaks = df$delta, limits = c(min(df$delta),max(df$delta))) # + geom_smooth(data=B,se=F,span=2,linetype=1,col=1) p2 <- grid.arrange(p,bottom=textGrob("subtitle",x=0.65,y=1,gp=gpar(fontsize=9)))
解决方案
要实现需求,需要将linetype与diff变量绑定,再手动指定对应线型,同时保证图例的颜色和线型同步匹配。修改后的完整代码如下:
library(ggplot2) library(gridExtra) df <- data.frame(delta=c(0,0.1,0.2,0.3,0.4,0.5,0,0.1,0.2,0.3,0.4,0.5,0,0.1,0.2,0.3,0.4,0.5,0,0.1,0.2,0.3,0.4,0.5), Pct=c(0.676,0.268,0.08,0.008,0,0,0.58,0.266,0.088,0.026,0.002,0,0.672,0.262,0.082,0.036,0.004,0,0.642,0.264,0.122,0.02,0.006,0), diff = as.character(c(0.1,0.1,0.1,0.1,0.1,0.1,0.2,0.2,0.2,0.2,0.2,0.2,0.3,0.3,0.3,0.3,0.3,0.3,0.4,0.4,0.4,0.4,0.4,0.4))) df$Pct=as.numeric(df$Pct) df$delta=as.numeric(df$delta) df$diff=as.character(df$diff) # 核心修改:在geom_smooth的aes中添加linetype映射,同时指定线型规则 p <- ggplot(data=df, aes(x = delta, y = Pct, col = diff))+ geom_point() + # 给geom_smooth添加linetype的aes映射 geom_smooth(aes(linetype = diff), se=F, span=2, na.rm = TRUE) + labs(title = "title", x="x axis",y="y axis")+ scale_color_manual(name="percentage", breaks=as.character(seq(0.1,0.4,0.1)), labels=as.character(seq(0.1,0.4,0.1)), values=c("red","blue","black","pink")) + # 手动指定每个diff对应的线型:0.3为实线(1),其余为虚线(2) scale_linetype_manual(name="percentage", breaks=as.character(seq(0.1,0.4,0.1)), labels=as.character(seq(0.1,0.4,0.1)), values=c(2,2,1,2)) + scale_y_continuous(breaks = seq(0, 1, 0.1), limits = c(0, 1))+ scale_x_continuous(breaks = seq(0,0.5,0.1), limits = c(0,0.5)) p2 <- grid.arrange(p,bottom=textGrob("subtitle",x=0.65,y=1,gp=gpar(fontsize=9)))
关键修改说明
- 在
geom_smooth的aes中添加linetype = diff,将线型与diff变量关联,让ggplot为每个diff值分配独立线型 - 使用
scale_linetype_manual指定线型:values=c(2,2,1,2)对应diff值0.1、0.2、0.3、0.4,其中1代表实线,2代表虚线 - 确保
scale_color_manual和scale_linetype_manual的name、breaks、labels完全一致,让ggplot将颜色和线型合并到同一个图例中,避免出现两个独立图例 - 修正原代码中
scale_x_continuous的breaks参数错误,改为明确的序列seq(0,0.5,0.1),避免因变量作用域问题报错
内容的提问来源于stack exchange,提问作者dummy_sas
相关产品推荐
相关产品推荐

