假设我有一个如下所示的数据框myiris
,我只想突出显示setosa
物种。
但是,我不希望其他物种显示在图例中。为了方便起见,我只是在新Highlight
列中将其余所有物种都设为 NA。
我执行以下操作:
data(iris)
library(ggplot2)
myiris <- data.frame(iris$Sepal.Length, iris$Petal.Length, Highlight=as.character(iris$Species))
names(myiris)[1:2] <- c('Sepal.Length', 'Petal.Length')
myiris$Highlight[myiris$Highlight!="setosa"] <- NA
myiris$Highlight <- factor(myiris$Highlight, levels="setosa")
plot_palette <- c("red","gray70")
P <- ggplot(myiris, aes(x=Sepal.Length, y=Petal.Length, color=Highlight)) +
geom_point(pch=16, size=5, alpha=0.5) +
scale_color_manual(values=plot_palette, breaks='setosa')
P
这产生了以下情节,这很棒,而且已经是我所期望的了;
不过,我也希望点形状也能具有Highlight
这样的功能,即setosa
点填充,而 NA 点则为空心。
我使用的scale_shape_manual
方法和刚才完全相同scale_color_manual
:
P <- ggplot(myiris, aes(x=Sepal.Length, y=Petal.Length, color=Highlight, shape=Highlight)) +
geom_point(size=5, alpha=0.5) +
scale_color_manual(values=plot_palette, breaks='setosa') +
scale_shape_manual(values=c(16,1), breaks='setosa')
但是,我得到:
警告消息:删除了 100 行包含缺失值或超出范围的值 (
geom_point()
)。
而产生的情节是这样的:
为什么其scale_shape_manual
行为与其对应函数不同,以及如何纠正它以获得我需要的(颜色和形状作为Highlight
图例中没有 NA 组的函数)?
编辑
列中的 NAHighlight
确实不是问题。您可以尝试使用原始iris
(而不是myiris
)和Species
列(而不是Highlight
)来实现相同的效果,但会出现相同的问题:
P <- ggplot(iris, aes(x=Sepal.Length, y=Petal.Length, color=Species)) +
geom_point(pch=16, size=5, alpha=0.5) +
scale_color_manual(values=c('red','gray70','gray70'), breaks='setosa')
和
P <- ggplot(iris, aes(x=Sepal.Length, y=Petal.Length, color=Species, shape=Species)) +
geom_point(size=5, alpha=0.5) +
scale_color_manual(values=c('red','gray70','gray70'), breaks='setosa') +
scale_shape_manual(values=c(16,1,1), breaks='setosa')
scale_color_manual
和基本上scale_shape_manual
是相同的,也就是说,在两种情况下,都会将ggplot2
分配给na.value=
排除的类别breaks=
(由于使用了 的未命名向量values=
)。在 的情况下,scale_color_manual
默认值为na.value
("grey50"
与 相比的差异"grey70"
几乎看不出来,但您可以使用 看到它layer_data()
),而NA
在 的情况下为scale_shape_manual
。因此,解决您的问题的一个方法是明确设置
na.value=
: