为什么scale_shape_manual的行为与scale_color_manual和scale_fill_manual不同?

问题描述 投票:0回答:1

假设我有一个像下面

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

这产生了以下情节,这很棒并且已经是我所期望的;

p1

但是,我也希望点形状作为

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()
)。

产生的情节是这样的:

p2

为什么

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')
ggplot2 legend scale na
1个回答
0
投票

基本上

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
  )

© www.soinside.com 2019 - 2024. All rights reserved.