Есть ли способ показать перекрывающиеся гистограммы в R без регулировки прозрачности?



Цель состоит в том, чтобы показать перекрывающиеся гистограммы, но я хочу избежать использования Альфа-коррекции, чтобы цвета оставались яркими.



Есть ли способ сделать это без корректировки Альфа-арг?

Цель состоит в том, чтобы отобразить цвета, показанные ниже:



hist(rnorm(mean=10, n = 1000), col='blue')
hist(rnorm(mean=11, n = 1000), col='red', add=T)


Введите описание изображения здесь



Но также покажите область перекрытия, как показано здесь



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


Введите описание изображения здесь



Подобный вопрос, который не совсем решает прозрачность:



Как создать черно-белые прозрачные перекрывающиеся гистограммы с помощью ggplot2?



Я был бы в порядке с плотностями и использованием других графических пакетов (например, lattice, ggplot2 и т. д.).



Edit: я бы хотел, чтобы участки были заполнены, а пересекающаяся область была другого цвета (например, фиолетовая, где красный и синий пересекаются).

639   3  

3 ответов:

Решение с использованием 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"))

# 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"))

Гистограмма

Поскольку Альфа не является вариантом, кроме использования плотностей, вы можете укладывать гистограммы друг на друга, хотя я бы предпочел плотности, так как их легче сравнивать.
# 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`.

Я придумал Клудж для этого, используя концепцию слоев. В сущности, я кладу красный цвет без Альфа, добавляю обратно синий слой под ним, а затем снова кладу красный с Альфа-регулировкой, чтобы сохранить перекрывающуюся область на контрасте, который я хочу (т. е. он остается фиолетовым).

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)

Введите описание изображения здесь

Также работает для 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))

Введите описание изображения здесь

Если вы не настаиваете на перекрытии, то вы можете рассмотреть возможность построения баров гистограммы бок о бок с помощью опции "dodge" позиционирования ggplot. Например:

# generate data, some Normal and Gamma variates with the same mean & SD
set.seed(137)
rd <- data.frame(
  n=rnorm(1000, mean=6.0, sd=4.243), 
  g=rgamma(1000, shape=2, scale=3)
)

# convert the data frame to "tall" format
tall.rd <- stack(rd)

# make the plot
ggplot(tall.rd) + geom_histogram(
  aes(values,..density..,colour=ind, fill=ind),
  bins=20,position="dodge"
)

уклонение от гистограмм

Comments

    Ничего не найдено.