Как добавить градиентную заливку в диаграмму geom_density - PullRequest
0 голосов
/ 28 января 2020

У меня есть набор данных, в котором я хотел бы построить график плотности одного столбца и добавить градиентную заливку, связанную с другим столбцом.

Например, этот код создает следующий график

library(datasets)
library(tidyverse)

df <- airquality

df %>% 
  group_by(Temp) %>% 
  mutate(count = n(), 
         avgWind = mean(Wind)) %>% 
  ggplot(aes(x = Temp, fill = avgWind)) + 
  geom_density()

plot example

Мне бы хотелось, чтобы график имел градиентная заливка, которая указывает, какой средний ветер (avgWind) был при каждой температуре вдоль оси x.

Я видел несколько примеров, которые позволяют мне создавать градиентную заливку, которая связана со значениями на самой оси x (в данном случае, Temp) или с помощью процентиля / квантилей, но мне бы хотелось градиентная заливка должна быть связана с дополнительной переменной.

Это примерно так, но вместо гистограммы я бы хотел сохранить его в виде сглаженного графика плотности:

df %>% 
  group_by(Temp) %>% 
  mutate(count = n(), 
         avgWind = mean(Wind)) %>% 
  ggplot(aes(x = (Temp), fill = avgWind, group = Temp)) + 
  geom_bar(aes(y = (..count..)/sum(..count..)))

enter image description here

1 Ответ

1 голос
/ 28 января 2020

Вы не можете делать градиентные заливки в geom_polygon, поэтому обычное решение - нарисовать много отрезков. Например, вы можете сделать что-то вроде этого:

library("datasets")
library("tidyverse")
library("viridis")


df <- airquality

df <- df %>%
  group_by(Temp) %>%
  mutate(count = n(), avgWind = mean(Wind))

## Since we (presumably) want continuous fill, we need to interpolate to
## get avgWind at each Temp value.
## The edges are grey because KDE is estimating density 
## Where we don't know the relationship between temp and avgWind
d2fun <- approxfun(df$Temp, df$avgWind)
#> Warning in regularize.values(x, y, ties, missing(ties)): collapsing to unique
#> 'x' values
dens <- density(df$Temp)

dens_df <- data.frame(x = dens$x, y = dens$y, fill = d2fun(dens[["x"]]))

ggplot(dens_df) +
  geom_segment(aes(x = x, xend = x, y = 0, yend = y, color = fill)) +
  scale_color_viridis()

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