【问题标题】:Plotting ggridges point shapes / colors by variable?通过变量绘制ggridges点形状/颜色?
【发布时间】:2018-03-30 20:46:56
【问题描述】:

这可能有一个明显的解决方案,但我对绘图有点天真。我想手动定义 point_shapepoint_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")

【问题讨论】:

  • 这个情节根本没有点。你想画什么点?您是否尝试绘制每个观察结果?你想为每个 x 值使用什么 y 值?
  • 抱歉,不知道我是否理解关于没有积分的部分?添加了我使用代码得到的图,该图显示了每个 x 轴观测值在 y 轴上抖动,以密度曲线为界。
  • 好的,所以问题是我忘记了我使用的是非 CRAN 版本的包。积分随开发版一起提供。感谢您的调查!

标签: r ggplot2 data-visualization ggridges


【解决方案1】:

包作者在这里。发生的情况如下:在一般情况下,您希望能够独立于线条颜色、大小等设置点颜色、大小等样式。但是,标准 ggplot 无法做到这一点。例如,它只有一种color 美学,适用于所有点和线。

为了解决这个问题,我创建了专门用于点的新美学point_colorpoint_sizepoint_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))

【讨论】:

    【解决方案2】:

    我们看不到 CRAN 上当前可用的 ggridges 版本的要点。

    您正在使用仅在开发版本中可用的选项 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 上发布问题/功能请求

    reprex package (v0.2.0) 于 2018 年 4 月 1 日创建。

    【讨论】:

    • 不需要功能请求。该功能已经存在,只是尚未记录。
    猜你喜欢
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2023-03-22
    • 2015-11-13
    相关资源
    最近更新 更多