有没有办法在不调整透明度的情况下在 R 中显示重叠的直方图?

Min*_*now 5 r colors histogram

目标是显示重叠的直方图,但我想避免使用 alpha 调整,以便颜色保持明亮。

有没有办法在不调整 alpha arg 的情况下做到这一点?

目标是显示如下所示的颜色:

hist(rnorm(mean=10, n = 1000), col='blue')
hist(rnorm(mean=11, n = 1000), col='red', add=T)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

但也要显示重叠区域,如下所示

hist(rnorm(mean=10, n = 1000), col='blue')
hist(rnorm(mean=11, n = 1000), col=rgb(1,0,0,0.5), add=T)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

类似的问题并没有完全解决透明度问题:

如何使用ggplot2创建黑白透明重叠直方图?

我对密度和使用其他图形包(例如格子、ggplot2 等)没问题。

编辑:我想要填充地块并且相交区域是不同的颜色(例如红色和蓝色相交的紫色)。

Tho*_*s K 5

ggplot2使用和 的解决方案geom_density

library(ggplot2)
library(tidyr)

# create data
set.seed(1234)
df <- data.frame(x = rnorm(1000, 10), y = rnorm(1000, 11)) %>% 
  gather(key, value) # use tidyr::gather to convert from wide to long format

ggplot(df, aes(value, colour = key)) +
  geom_density(show.legend = F) +
  theme_minimal() +
  scale_color_manual(values = c(x = "red", y = "blue"))
Run Code Online (Sandbox Code Playgroud)

# use 'adjust' to adjust density estimation
ggplot(df, aes(value, colour = key)) +
  geom_density(show.legend = F, adjust = .5) +
  theme_minimal() +
  scale_color_manual(values = c(x = "red", y = "blue"))
Run Code Online (Sandbox Code Playgroud)

直方图

由于阿尔法是没有选择的,除了使用密度之外,您还可以将直方图堆叠在一起,尽管我更喜欢密度,因为它们更容易比较。

# using stacked histograms
ggplot(df, aes(value, fill = key)) +
  geom_histogram(show.legend = F) +
  theme_minimal() +
  scale_fill_manual(values = c(x = "red", y = "blue"))
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Run Code Online (Sandbox Code Playgroud)


Min*_*now 3

我使用图层的概念想出了一个解决方案。本质上,我在没有 alpha 的情况下放置红色,在下面添加回蓝色层,然后通过 alpha 调整再次将红色放回去,以保持重叠区域处于我想要的对比度(即它保持紫色)。

one <- rnorm(mean=10, n = 1000)
two <- rnorm(mean=11, n = 1000)
hist(one, col='blue', main='Bright colors, visible overlap')
hist(two, col='red', add=T)
hist(one, col='blue', add=T)
hist(two, col=rgb(1,0,0,0.5), add=T)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

也适用于 ggplot:

qplot(one, fill=I('blue'))+
  geom_histogram(aes(two), fill=I('red'))+
  geom_histogram(aes(one), fill=I('blue'))+
  geom_histogram(aes(two), fill=I('red'), alpha=I(0.5))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述