Построение графиков указывает на формы / цвета по переменной?

Вероятно, есть очевидное решение, но я немного наивен с графикой. Я хотел бы иметь point_shape а также point_fill определяется вручную, чтобы указать, например, гендерные группы. Как бы я поступил так?

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

# Simulate data:
df <- data.frame(female = factor(sample(0:1, size = 500, replace = TRUE)),
                 intervention = factor(sample(0:1, size = 500, replace = TRUE))) %>% 
  dplyr::mutate(value = ifelse(female == "1", runif(n = 500, min = 0, max = 100), 
                               rnorm(n = 500, mean = 50, sd = 20)))

# Draw plot:
df %>% 
  ggplot2::ggplot(aes(y = intervention)) +
  ggridges::geom_density_ridges2(aes(x = value, 
                                     colour = "black", 
                                     fill = female),
                                 scale = .7,
                                 alpha = 0.6, 
                                 size = 0.25,
                                 jittered_points = TRUE, 
                                 point_shape = 21,
                                 point_size = 0.85,
                                 point_fill = "black")

Вот

2 ответа

Решение

Автор пакета здесь. Происходит следующее: в общем случае вы хотите иметь возможность стилизовать цвет, размер и т. Д. Независимо от цвета линии, размера и т. Д. Однако стандартный ggplot не может этого сделать. Есть только один color эстетический, например, который применяется ко всем точкам и линиям.

Чтобы обойти эту проблему, я создал новую эстетику point_color, point_size, point_shapeи т. д., которые относятся конкретно к точкам. Вы можете отобразить на них данные, как обычно. Тем не менее, ggplot не может создать для них шкалы, и поэтому я создал scale_discrete_manual() (и несколько других шкал), которые вы можете использовать для определения соответствующих шкал.

Собрав все это вместе, вы получите что-то вроде этого:

# Draw plot:
df %>% 
  ggplot2::ggplot(aes(y = intervention)) +
  ggridges::geom_density_ridges2(aes(x = value, 
                                     point_color = female,
                                     point_fill = female,
                                     point_shape = female,
                                     fill = female),
                                 scale = .7,
                                 alpha = 0.6, 
                                 size = 0.25,
                                 jittered_points = TRUE, 
                                 point_size = 0.85) +
  ggplot2::scale_fill_manual(values = c("#A0FFA0", "#A0A0FF")) +
  ggridges::scale_discrete_manual(aesthetics = "point_color", values = c("#00BF00", "#0000BF")) +
  ggridges::scale_discrete_manual(aesthetics = "point_fill", values = c("#80FF80", "#8080FF")) +
  ggridges::scale_discrete_manual(aesthetics = "point_shape", values = c(22, 24))

Мы не можем видеть точки с ggridges версия в настоящее время доступна на CRAN.

Вы используете параметры, которые доступны только в разрабатываемой версииggridges доступно на github:

library(tidyverse)
# Simulate data:
df <- data.frame(female = factor(sample(0:1, size = 500, replace = TRUE)),
                 intervention = factor(sample(0:1, size = 500, replace = TRUE))) %>% 
    dplyr::mutate(value = ifelse(female == "1", runif(n = 500, min = 0, max = 100), 
                                 rnorm(n = 500, mean = 50, sd = 20)))

# devtools::install_github("clauswilke/ggridges")
library(ggridges)

ggplot(df, aes(y = intervention)) +
    geom_density_ridges2(aes(x = value, fill = female),
                         scale = .7,
                         alpha = 0.6, 
                         size = 0.25,
                         jittered_points = TRUE, 
                         point_shape = 21,
                         point_size = 0.85,
                         point_fill = "black") 
#> Picking joint bandwidth of 8.06

Кажется невозможным сопоставить эстетику точек с какими-либо переменными. Они должны быть фиксированными значениями. Я попытался указать формы вручную, но это не работает:

ggplot(df, aes(y = intervention)) +
    geom_density_ridges2(aes(x = value, fill = female),
                                   scale = .7,
                                   alpha = 0.6, 
                                   size = 0.25,
                                   jittered_points = TRUE, 
                                   point_shape = c(21,22)[df$female],
                                   point_size = 0.85,
                                   point_fill = "black") 
#> Picking joint bandwidth of 8.06
#> Error: Aesthetics must be either length 1 or the same as the data (2548): size, scale, alpha, point_shape, point_size, point_fill

Лучшее, что я могу сделать, это не очень хороший сюжет:

ggplot(df , aes(y = intervention)) +
    geom_density_ridges2(aes(x = value, fill = female),
                         scale = .7,
                         alpha = 0.6, 
                         size = 0.25) +
    geom_point(aes(x = value, shape = female), 
               position = position_jitter(height = 0.2, width = 0))
#> Picking joint bandwidth of 8.06

Вы могли бы, вероятно, опубликовать запрос о проблеме / функции на GitHub

Создано 2018-04-01 пакетом представлением (v0.2.0).

Другие вопросы по тегам