Сопоставление альфа-значений легенды с гистограммой в ggplot2 - PullRequest
0 голосов
/ 31 октября 2018

У меня есть data.frame pp, где первые несколько строк выглядят так:

  fill x
1 a    0.3048367
2 b    0.3318136
3 c    0.2081782
4 a    0.2969265
5 b    0.2637778
6 c    0.3509706

Я хочу создать сюжет, подобный следующему,

library(ggplot2)
p <- ggplot(data = pp) + 
     geom_histogram(data=subset(pp, fill == 'a'),
         aes(x=x, y=..density.., fill=fill), alpha=0.3) + 
     geom_histogram(data=subset(pp, fill == 'b'),
         aes(x=x, y=..density.., fill=fill), alpha=0.3) + 
     geom_histogram(data=subset(pp, fill == 'c'),
         aes(x=x, y=..density.., fill=fill), alpha=0.3) +  
     scale_fill_manual(values = c("a" = "red", "b" = "green", c = "blue")) +  
     theme(legend.title=element_blank())

enter image description here

Теперь альфа-значения в легенде не соответствуют альфа-значениям гистограммы. Я пытаюсь добавить,

p + guides(fill = guide_legend(override.aes = list(alpha = 0.3)))

но я получаю точно такой же сюжет. Как получить альфа-значения в легенде в соответствии с сюжетом?

Примечание: я должен использовать geom_histogram три раза, потому что я хочу, чтобы гистограммы накладывались друг на друга. Особое значение имеет также цветовая заливка.

Ответы [ 4 ]

0 голосов
/ 31 октября 2018

Вам не нужно использовать geom_hisogram() несколько раз. Положение ячеек контролируется аргументом position, и position='identity' даст вам то, что вы хотите, в то время как по умолчанию position='stack'. scale_fill_manual уже правильно сопоставляет цвета, даже с одним geom_histogram() Пожалуйста, попробуйте следующий код:

ggplot(pp, aes(x = x, y = ..density.., fill = fill)) +
  geom_histogram(alpha = .3, position = 'identity') +
  scale_fill_manual(values = c('a' = 'red', 'b' = 'green', 'c' = 'blue'))
0 голосов
/ 31 октября 2018

Вы можете сделать это, используя position_identity при вызове geom_histogram без необходимости вызова функции 3 раза. Это также автоматически обновит альфа в легенде, поскольку альфа устанавливается только 1 раз (вместо 3 раз при каждом вызове в исходном коде. Вот пример с использованием некоторых смоделированных данных:

library(tidyverse)

df <- data_frame(
  a = rnorm(1000, 0, 1),
  b = rnorm(1000, 2, 1),
  c = rnorm(1000, -2, 0.5)
) %>%
  gather(key = "fill", value = "x")

df
#> # A tibble: 3,000 x 2
#>    fill       x
#>    <chr>  <dbl>
#>  1 a     -0.951
#>  2 a      0.321
#>  3 a      0.551
#>  4 a      0.166
#>  5 a     -1.55 
#>  6 a      1.27 
#>  7 a     -0.224
#>  8 a     -0.243
#>  9 a     -1.48 
#> 10 a     -0.888
#> # ... with 2,990 more rows

ggplot(df, aes(x = x, fill = fill)) +
  geom_histogram(aes(y = ..density..), position = position_identity(), alpha = 0.5) +
  scale_fill_manual(values = c("a" = "red", "b" = "green", "c" = "blue")) +
  theme_classic() +
  theme(legend.title = element_blank())
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Создано в 2018-10-31 пакетом представ. (v0.2.1)

0 голосов
/ 31 октября 2018

Вы почти у цели.

pp=data.frame(fill=rep(c('a','b','c'),100),x=rnorm(300))

library(ggplot2)
p <- ggplot(data = pp) + 
     geom_histogram(data=subset(pp, fill == 'a'),
         aes(x=x, y=..density.., fill=fill), alpha=0.3) + 
     geom_histogram(data=subset(pp, fill == 'b'),
         aes(x=x, y=..density.., fill=fill), alpha=0.3) + 
     geom_histogram(data=subset(pp, fill == 'c'),
         aes(x=x, y=..density.., fill=fill), alpha=0.3) +  
     scale_fill_manual(values = c("a" = "red", "b" = "green", c = "blue"),aesthetics=c(alpha=.3)) +  
     theme(legend.title=element_blank())

p

enter image description here

0 голосов
/ 31 октября 2018

Я думаю, что этот код работает для вас.

ggplot(pp,aes(x=x,stat(density))) + geom_histogram(data=subset(pp,fill == 'a'),fill = "red", alpha = 0.3,binwidth = 0.05) + geom_histogram(data=subset(pp,fill== 'b'),fill = "green", alpha = 0.3,binwidth = 0.10) + geom_histogram(data=subset(pp,fill== 'c'),fill = "blue", alpha = 0.3,binwidth = 0.15)+ theme(legend.title=element_blank())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...