0

如何使点的颜色具体化?正如下面的代码所示,我使用最后一种颜色覆盖了第一种颜色,现在在我的图例上,我的 data1 和 data2 具有相同的颜色,这不是我想要的。

ggplot(data,aes(x,y,color,group))+
geom_point(data1,aes(fill="data1"),shape="*",size=12,color="blue")+
geom_point(data2,aes(fill="data2"),shape="*",size=12,color="red")

只是为了强调 data1 和 data2 在某些条件下由数据派生

4

1 回答 1

1

首先,让我们谈谈您的示例中真正发生的事情。然后,我将提供两种方法来解决它。

OP的例子中到底发生了什么

这是OP示例的代表:

library(ggplot2)

set.seed(8675309)
data1 <- data.frame(x=1:10, y=rnorm(10, 10))
data2 <- data.frame(x=sample(1:10, 10, replace=TRUE), y=rnorm(10, 11, 0.4))

ggplot(mapping= aes(x=x, y=y)) +
  geom_point(data=data1, aes(fill='data1'), shape='*', size=12, color='blue') +
  geom_point(data=data2, aes(fill='data2'), shape='*', size=12, color='red')

在此处输入图像描述

乍一看,这些点看起来像我们希望的那样着色,但图例仅由最后一个着色geom_point但是......这实际上不是这里发生的事情。实际上,图例中的结果是由于在两个图例键中在蓝点之上绘制了一个红点。当你改变蓝点的形状时,我们可以很清楚地证明这一点:

ggplot(mapping= aes(x=x, y=y)) +
  geom_point(data=data1, aes(fill='data1'), size=12, color='blue') +
  geom_point(data=data2, aes(fill='data2'), shape='*', size=12, color='red')

在此处输入图像描述

过度绘图的原因很简单:OP 已经设置了fill美学,aes()然后color离散地调整了修饰符。因此,图例反映的不是 中的差异color,而是 中的差异fill。由于“*”不是具有 的形状fill,所以除了 的不同外,外观没有任何区别color

怎么修

有两种方法可以解决此问题。两者都涉及color aes() aes()的移动。一种方法是维护两个数据集data1,并data2像 OP 一样将其作为单独的数据框,我们geom_point对每个数据集进行调用,第二种方法应用Tidy Data原则,通常是使用.ggplot2

不整洁的方式

将call 和 remove移入color内部aes(),因为它不适用于此处。这样做的结果将意味着将创建一个图例并将“data1”和“data2”添加到该图例中。颜色是自动选择的,但如果我们想指定颜色,我们可以使用:geom_pointfillggplotscale_color_manual()

ggplot(mapping= aes(x=x, y=y)) +
  geom_point(data=data1, aes(color='data1'), shape='*', size=12) +
  geom_point(data=data2, aes(color='data2'), shape='*', size=12) +
  scale_color_manual(values=c('blue', 'red'))

在此处输入图像描述

顺便说一句,如果你保留colorinsideoutside aes(),则color 外部aes()将覆盖aes()函数内部的那个。这意味着您的点将是正确的颜色,但不会绘制图例。

整洁的数据方式

同样,这种方式更受欢迎。这个想法是你应该将你的数据集组合成一个,添加一列来区分数据的来源。然后,您可以使用该列来指示如何标记点并为其着色。您只需要一个电话即可geom_point完成这项工作。在这个特定示例中,它可能看起来没有太大改进,但考虑一下如果你有 10 个数据集会有什么不同。

library(dplyr)
library(tidyr)

# note we add a named list to ensure the id column is correctly populated
df <- bind_rows(list(data1=data1, data2=data2), .id="id")

ggplot(df, aes(x=x, y=y, color=id)) + geom_point(shape='*', size=12) +
  scale_color_manual(values=c('blue', 'red'))

结果图与另一个图相同。

编辑:如果已经有色彩美学怎么办?

虽然不是问题的一部分,但 OP 表示在他们的特定情况下,已经color定义了美学(因此发送的值scale_color_manual()是不够的。这里有一些关于如何进行的选项:

  • 在 OP 的情况下,消息表明他们需要提供 6 个值,而不是 2 个值。OP 可以尝试提供 6 种颜色并使用命名矢量(即c("data1" = "blue", "data2" = "red", ...)相应地映射它们。
  • 使用具有填充颜色的点形状并将其用于单独的图例
  • 使用相同的星号*点形状和颜色,但覆盖图例中的美学。

如果没有来自 OP 的实际数据以及他们专门使用的包含冲突色彩美学的代码,就很难为该特定情况提出最佳方案;但是,我将在这里演示最后两种方法:

使用带有填充颜色的点形状

ggplot(mapping= aes(x=x, y=y)) +
  geom_point(data=data1, aes(fill='data1'), shape=21, size=12, color='NA') +
  geom_point(data=data2, aes(fill='data2'), shape=21, size=12, color='NA') +
  scale_fill_manual(values=c('data1'='blue', 'data2'='red'))

在此处输入图像描述

覆盖颜色图例的美学

ggplot(mapping= aes(x=x, y=y)) +
  geom_point(data=data1, aes(fill='data1'), shape='*', size=12, color='blue') +
  geom_point(data=data2, aes(fill='data2'), shape='*', size=12, color='red') +
  guides(
    fill=guide_legend(override.aes = list(color=c('blue','red')))
  )

在此处输入图像描述

于 2021-03-31T16:25:46.177 回答