R:ggplot2密度图显示错误的填充颜色

时间:2020-01-23 21:55:26

标签: r ggplot2 colors fill

我想从一个密度图上的两个独立数据框中绘制两个变量(“ red_variable”,“ green_variable”)的密度,并使用红色和绿色作为两个变量。

这是我的编码尝试:

library(ggplot2)

### Create dataframes
red_dataframe <- data.frame(red_variable = c(10,11,12,13,14))
green_dataframe <- data.frame(green_variable = c(6,7,8,9,10))
mean(red_dataframe$red_variable) # mean is 12
mean(green_dataframe$green_variable) # mean is 8

### Set colors
red_color= "#FF0000"
green_color= "#008000"

### Trying to plot densities with correct colors and correct legend entries
ggplot() +
geom_density(aes(x=red_variable, fill = red_color, alpha=0.5), data=red_dataframe) + 
geom_density(aes(x=green_variable, fill = green_color, alpha=0.5), data=green_dataframe) +
scale_fill_manual(labels = c("Density of red_variable", "Density of green_variable"), values = c(red_color, green_color)) +
xlab("X value") +
ylab("Density") +
labs(fill = "Legend") +
guides(alpha=FALSE)

结果:图例显示正确的颜色,但是绘图上的颜色是错误的:“红色”变量以绿色绘制,“绿色”变量以红色绘制。 x轴上的“绿色”密度(平均值= 8)应该出现在左侧,“红色”密度(平均值= 12)应该出现在右侧。剧情的这种行为对我来说毫无意义。

我实际上可以通过在代码中切换红色和绿色来获得所需的结果:

### load ggplot2
library(ggplot2)

### Create dataframes
red_dataframe <- data.frame(red_variable = c(10,11,12,13,14))
green_dataframe <- data.frame(green_variable = c(6,7,8,9,10))
mean(red_dataframe$red_variable) # mean is 12
mean(green_dataframe$green_variable) # mean is 8

### Set colors
red_color= "#FF0000"
green_color= "#008000"

### Trying to plot densities with correct colors and correct legend entries
ggplot() +
geom_density(aes(x=red_variable, fill = green_color, alpha=0.5), data=red_dataframe) + 
geom_density(aes(x=green_variable, fill = red_color, alpha=0.5), data=green_dataframe) +
scale_fill_manual(labels = c("Density of red_variable", "Density of green_variable"), values = c(red_color, green_color)) +
xlab("X value") +
ylab("Density") +
labs(fill = "Legend") +
guides(alpha=FALSE)

...虽然该图现在很有意义,但是代码没有意义。我真的不能相信代码会做与我期望的相反的事情。这是什么问题我是色盲吗?

2 个答案:

答案 0 :(得分:2)

在代码上,为了使颜色位于正确的位置,您需要指定fill = red_colorfill = green_color(以及alpha常量,因为它是@Gregor指出的) aes之外,例如:

...+ 
geom_density(aes(x=red_variable), alpha=0.5, fill = red_color, data=red_dataframe) + 
  geom_density(aes(x=green_variable), alpha=0.5, fill = green_color, data=green_dataframe) + ...

或者,您可以将数据帧绑定在一起,将它们重新整形为更长的格式(更适合ggplot),然后添加可以与scale_fill_identity函数一起使用的颜色列({{3} }):

df <- cbind(red_dataframe,green_dataframe)

library(tidyr)
library(ggplot2)
library(dplyr)
df <- df %>% pivot_longer(.,cols = c(red_variable,green_variable), names_to = "var",values_to = "val") %>%
  mutate(Color = ifelse(grepl("red",var),red_color,green_color))

ggplot(df, aes(val, fill = Color))+
  geom_density(alpha = 0.5)+
  scale_fill_identity(guide = "legend", name = "Legend", labels = levels(as.factor(df$var)))+
  xlab("X value") +
  ylab("Density")

https://ggplot2.tidyverse.org/reference/scale_identity.html

它能回答您的问题吗?

答案 1 :(得分:1)

您正在尝试使用ggplot,就像它是基本图形一样……心态转变可能需要一些时间才能习惯。 dc37的答案显示了您应该如何做。我将尝试解释您尝试中出了什么问题:

fill = green_color放在aes()内时,因为它位于aes() ggplot中,实际上会创建一个新数据列,其中填充了{{ green_color中的1}}值,即green_data_frame。与红色数据框中的红色值相同。如果我们通过简单地删除您的"#008000", "#008000", "#008000", ...来修改您的地块,就可以看到这一点:

scale

enter image description here

我们实际上可以通过放置ggplot() + geom_density(aes(x = red_variable, fill = green_color, alpha = 0.5), data = red_dataframe) + geom_density(aes(x = green_variable, fill = red_color, alpha = 0.5), data = green_dataframe) + xlab("X value") + ylab("Density") + labs(fill = "Legend") + guides(alpha = FALSE) 缩放比例来获得所需的缩放比例,该缩放比例是针对(identity中常见,在base中罕见)设计的,您实际上将颜色值放入数据。

ggplot2

enter image description here

添加ggplot() + geom_density(aes(x = red_variable, fill = green_color, alpha = 0.5), data = red_dataframe) + geom_density(aes(x = green_variable, fill = red_color, alpha = 0.5), data = green_dataframe) + scale_fill_identity() + xlab("X value") + ylab("Density") + labs(fill = "Legend") + guides(alpha = FALSE) 时,ggplot就像“好,很酷,您想指定颜色和标签”。但是您在考虑将图层添加到绘图的顺序(非常类似于基本图形),而scale_fill_manual在考虑这些新创建的变量ggplot"#FF0000"默认情况下为按字母顺序(就像它们是数据帧中的"#008000"factor列一样)。而且由于您碰巧按相反的字母顺序添加图层,因此已切换。

dc37的答案显示了几种更好的方法。使用character,您应该(a)尽可能使用单个长格式数据帧(b)不要在ggplot内放入常量(常量颜色,常量alpha等),(c )在颜色不是恒定的情况下,可以通过aes()scale_fill_*函数设置颜色。