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

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

我想在一个密度图上绘制来自两个独立数据框的两个变量(“ 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)

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

r ggplot2 colors fill
1个回答
0
投票

您可以绑定数据框,将其重整形为更长的格式(更适合ggplot,然后添加可以与scale_fill_identity函数一起使用的颜色列(https://ggplot2.tidyverse.org/reference/scale_identity.html):

df <- cbind(red_dataframe,green_dataframe)
library(tidyr)
library(ggplot2)
library(dplyr)
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(aes(val, fill = Color))+
  geom_density(alpha = 0.5)+
  scale_fill_identity(guide = "legend", name = "Legend", labels = c("green","red"))

enter image description here

它回答了您的问题吗?

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