假设我有一个像下面
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 组)?
编辑
Highlight
栏中的NA确实不是问题。您可以尝试使用原始
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=
排除的类别。在 scale_color_manual
的情况下,默认 na.value
是 "grey50"
(与 "grey70"
相比,差异几乎不可见,但您可以使用 layer_data()
看到它),而在 NA
的情况下,它是 scale_shape_manual
。
因此,解决您问题的一种方法是明确设置
na.value=
:
library(ggplot2)
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",
na.value = "gray70" # The default is "grey50"
) +
scale_shape_manual(
values = c(16, 1, 1),
breaks = "setosa",
na.value = 1
)