ggplot2绘制Cleveland dot plot时,隐藏单个图层图例值的问题
解决Cleveland点图图例多余项问题
你遇到的核心问题是:scale_color_manual中包含了yes和no的颜色映射规则,即便geom_segment设置了show.legend=FALSE,尺度层面仍会把这两个值纳入图例。以下是两种简单可行的解决方法:
方案1:限定尺度只显示需要的图例项
修改scale_color_manual,通过breaks参数指定仅保留value1和value2的图例项,直接过滤掉yes和no:
value1 <- abs(rnorm(26))*2 data <- data.frame( x=LETTERS[1:26], value1=value1, value2=value1+1+rnorm(26, sd=1) ) %>% mutate(gt=ifelse(value1>value2,'yes','no')) dataLong <- data %>% select(-gt) %>% pivot_longer(cols=-x) ggplot() + geom_segment(data=data, aes(x=x, xend=x, y=value1, yend=value2, color=gt), show.legend = FALSE) + geom_point(data=dataLong, aes(x=x,y=value,color=name),size=3) + coord_flip() + scale_color_manual( values=c(yes='red',no='blue',value1='red',value2='blue'), breaks=c("value1", "value2"), # 仅保留需要的图例项 labels=c("数值1", "数值2") # 可选:自定义图例显示文本 )
方案2:让线段颜色不参与美学映射
将线段的颜色从aes()中移除,直接通过gt的结果赋值颜色值,这样线段颜色完全不占用color美学的映射通道,图例只会显示点的映射项:
value1 <- abs(rnorm(26))*2 data <- data.frame( x=LETTERS[1:26], value1=value1, value2=value1+1+rnorm(26, sd=1) ) %>% mutate(gt=ifelse(value1>value2,'red','blue')) # 直接存储颜色值 dataLong <- data %>% select(-gt) %>% pivot_longer(cols=-x) ggplot() + geom_segment(data=data, aes(x=x, xend=x, y=value1, yend=value2), color=data$gt, show.legend = FALSE) + geom_point(data=dataLong, aes(x=x,y=value,color=name),size=3) + coord_flip() + scale_color_manual(values=c(value1='red',value2='blue')) # 仅维护点的颜色映射
方案2更简洁,无需在尺度中维护多余的颜色规则,线段颜色直接通过数据列赋值,彻底避免对图例的干扰。
内容的提问来源于stack exchange,提问作者Ben Carlson
相关产品推荐
相关产品推荐

