我想从一个密度图上的两个独立数据框中绘制两个变量(“ 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)
...虽然该图现在很有意义,但是代码没有意义。我真的不能相信代码会做与我期望的相反的事情。这是什么问题我是色盲吗?
答案 0 :(得分:2)
在代码上,为了使颜色位于正确的位置,您需要指定fill = red_color
或fill = 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
我们实际上可以通过放置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
添加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_*
函数设置颜色。