首页 > 解决方案 > 在ggplot2中使用颜色信息作为aes_string的图层时,如何指定要显示的颜色图例/指南?

问题描述

我在理解 ggplot2 图例/指南时遇到了一些问题。我正在尝试为 geom_point 图层创建一个带有单独颜色图例的 ggplot,并为包含轮廓颜色的 geom_polygon 图层创建一个填充图例(我不想在图例中显示)。对于数据中的特定类别,我需要点具有不同的形状和不同的颜色。最重要的是,我需要轮廓与填充颜色相同的多边形,只是完全不透明度,这些不应显示在颜色图例中。

我使用 mtcars 数据集重新创建了我的问题:

library(ggplot2)
library(dplyr)
library(stringr)

data(mtcars)
mtcars$car<-rownames(mtcars)
mtcars$brand<-str_split_fixed(mtcars$car, " ", 2)[,1]
mtcars$cyl<-as.factor(mtcars$cyl)
mtcars$gear<-as.factor(mtcars$gear)
mtcars$country<-'Japan'
mtcars$country[mtcars$brand %in% c("Cadillac","Lincoln","Chrysler",'Dodge',"AMC","Camaro","Pontiac")]<-'US'
mtcars$country[mtcars$brand %in% c("Volvo","Merc","Ferrari",'Fiat',"Ford","Lotus","Maserati",'Porsche','Valiant')]<-'EU'
mtcars$country<-as.factor(mtcars$country)

num_cols<-c('mpg','disp','hp','drat','wt','qsec','vs','am','carb')
pca<-prcomp(mtcars[,num_cols],scale=T,center=T)
mtcars$x<-pca$x[,1]
mtcars$y<-pca$x[,2]

hull_data <- mtcars %>% group_by(country) %>% slice(chull(x, y))
p<-ggplot(data=mtcars,aes_string(x='x',y='y'))
p<-p+geom_point(size=2,aes_string(shape='cyl',colour='gear')) #show shape and colour in legend
p<-p+geom_polygon(data=hull_data,aes_string(fill = 'country',colour='country'),alpha = .4) #show fill, but not the colour in legend
p

目前,颜色图例包含点颜色级别和多边形轮廓颜色级别,这不是所需的输出。由于绘图是在函数中构建的,因此我需要使用 aes_string(用户传入每个属性的列名)。通常,我会简单地将多边形的颜色放在 aes 映射之外,但是对于字符串,这不起作用(因此它仍然在 aes_string 中,这会触发一个图例)。我试过设置

p<-p+guides(colour=F)

在创建 geom_polygon 图层然后添加 geom_point 图层之后,但这会同时添加 geom_pointgeom_layer 的颜色信息。我可以考虑分配固定列,例如:

data$hull<-data[[HULL_COLUMN]])

然后使用 aes 而不是 aes_string,但是像点颜色这样的一些参数是可选的,对我来说似乎很脏。

你有什么建议吗?

提前谢谢了!

标签: rggplot2plotlegend

解决方案


推荐阅读