【问题标题】:How to add a different alpha to every bar depending on Y axis "height"如何根据 Y 轴“高度”为每个条添加不同的 alpha
【发布时间】:2021-08-27 14:00:10
【问题描述】:

我想将 alpha 添加到我的条形图 (ggplot2) 但每个条我想要一个不同的 alpha,它应该取决于 y 轴高度。 我对 r 不太有经验,所以我还在苦苦挣扎:) 到目前为止,我的代码是这样的。 正确的选择是二项分布,并且只标注了 1 或 0。

#Data preparation#
DataMerged235$treatment <- factor(DataMerged235$treatment, levels = c("odour & flavour", "only odour", "only flavour"))

#Figure#
 fig235 <- ggplot (DataMerged235, aes(x = treatment, y = correct_final)) +
  stat_summary(fun.y = "mean", geom = "bar", fill="dodgerblue4") +
  stat_summary(fun.data = "mean_cl_boot", geom="errorbar", width = 0.2) +
  ylab("Proportion of correct choices") + xlab("") + theme_bw(16) +
  geom_abline(intercept = 0.5, slope = 0, color = "black", linetype = 2) +
  coord_cartesian(ylim = c(0.4, 1.15))

 print(fig235)

这里是当前输出:https://ibb.co/mHVSwpt

我想补充一点,条形的 y max 越高意味着 alpha 越暗。在我们的示例中,这将导致 alpha 降低(从左到右)。

我数据中的随机部分:

structure(list(colony = c(14, 5, 12, 11, 12, 14, 12, 18, 12, 
12), correct_initial = c(1, 0, 1, 1, 1, 1, 0, 0, 1, 1), correct_final = c(1, 
0, 1, 1, 1, 1, 0, 0, 1, 1), treatment = c("odour & flavour", 
"only odour", "odour & flavour", "only odour", "odour & flavour", 
"odour & flavour", "odour & flavour", "only flavour", "only flavour", 
"odour & flavour")), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))

【问题讨论】:

  • 有趣的问题 - 我还不知道答案,但我相信函数 after_stat()after_scale() 将在解决方案中发挥作用。

标签: r ggplot2 bar-chart alpha


【解决方案1】:

我还没有弄清楚如何在 stat_summary 行中执行此操作,但另一种方法是预先计算您要使用的统计信息。

library(dplyr)
mtcars %>%
    group_by(gear) %>%
    summarize(mean = mean(mpg),
              stats = mean_cl_boot(mpg), .groups = "drop") -> mtcars_stats
> mtcars_stats
# A tibble: 3 x 3
   gear  mean stats$y $ymin $ymax
  <dbl> <dbl>   <dbl> <dbl> <dbl>
1     3  16.1    16.1  14.4  17.7
2     4  24.5    24.5  21.8  27.4
3     5  21.4    21.4  16.3  26.6

那么就很简单了:

ggplot(aes(gear, mean, ymin = stats$ymin, ymax = stats$ymax)) +
  geom_col(fill = "dodgerblue4", aes(alpha = mean)) +
  geom_errorbar(width = 0.2)

编辑 - 使用来自 OP 的新示例数据进行更新:

DataMerged235 %>%
    mutate(treatment = factor(treatment, levels = c("odour & flavour", "only odour", "only flavour"))) %>%
    group_by(treatment) %>%
    summarize(mean = mean(correct_final),
              stats = mean_cl_boot(correct_final), .groups = "drop") %>%
    ggplot(aes(treatment, mean, ymin = stats$ymin, ymax = stats$ymax)) +
    geom_col(fill = "dodgerblue4", aes(alpha = mean)) +
    geom_errorbar(width = 0.2)

【讨论】:

  • 感谢您的回答。我试过了,但收到 2 个错误消息。 “mean.default(DataMerged235) 中的警告”参数不是数字也不是布尔值。”并且不能结合菌落(双)和处理(因子 dde1b)我将部分数据添加到原始帖子中。
  • 它似乎适用于提供的示例。如果它不适用于您的完整数据,请查看您是否可以共享一个同样损坏的样本。
  • 非常感谢:)!有效!我会提高你的答案,但到目前为止我还没有 15 条特权。
  • + guides(alpha = "none")scale_alpha_continuous(range = c(0.4, 1), trans = "sqrt" ) 之类的东西可以控制 alpha 值的范围以及 alpha 在该范围的底部或顶部是否变化得更剧烈。
  • 非常感谢:)!
猜你喜欢
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
相关资源
最近更新 更多