【问题标题】:Use viridis and Map values to colour in a histogram plot使用 viridis 和 Map 值在直方图中着色
【发布时间】:2018-06-11 20:33:48
【问题描述】:

我正在尝试重新创建左侧的两个图: 颜色渐变应该在 0 处更亮,在极值处更暗。我想使用 viridis 包来创建颜色渐变。

这是我的示例数据集:

library(tidyverse)
library(viridis)
# simulate t-values
data = data.frame(sim =1:10000,
                  t_0= rt(n = 10000,df =12, ncp=0), 
                  t_1 = rt(n = 10000,df =12, ncp=1.2))
# compute p-values
data = data %>% 
  mutate(p_0 = 2* pt(t_0, df=12, lower.tail = ifelse(t_0 > 0,FALSE ,TRUE)),
         p_1 = 2* pt(t_1, df=12, lower.tail = ifelse(t_1 > 0,FALSE ,TRUE)))

# convert from wide to long
data.long = data %>% 
  gather(condition,measurement, t_0:p_1) %>%
  separate(col=condition, into=c("para","hyp"), sep = "_")

# convert to wide repeated measures format
data.wide = data.long %>% spread(key = para, measurement)

这是我尝试过的,但是这里的颜色以 x 轴上的值的平均值为中心,而不是以 0 为中心。我不知道如何使它正确,我认为这是关于尝试将 scale_fill 与直方图一起使用。

ggplot(data.wide) + 
  geom_histogram(aes(x=t,fill=..x..),
                 binwidth=.01 )+
  scale_fill_gradientn(colours = c(viridis::viridis(5),
                                   rev(viridis::viridis(5))[2:5]))+
  facet_wrap(~ hyp  ,ncol=1)

这给了我这个输出:

【问题讨论】:

  • 使用scale_fill_gradient2,您可以设置midpoint。在scale_fill_gradientn中看不到等效项

标签: r ggplot2 viridis


【解决方案1】:

使用scale_fill_gradientn,有一个重新缩放函数可以将您的观察值映射到 [0,1] 以进行着色。您可以创建自己的重新缩放器以将某个数字放在中间。例如

center_around <- function(center=0) {
  function(x, to=NA, from=NA) {
    r <- max(abs(from-center))
    (x - (center-r)) / 2/r
  }
}

将返回一个函数,该函数将围绕给定数字的值居中,然后重新调整为 0、1。您可以将其用于

ggplot(data.wide) + 
  geom_histogram(aes(x=t,fill=..x..),
                 binwidth=.01 )+
  scale_fill_gradientn(colours = c(viridis::viridis(5),
                                   rev(viridis::viridis(5))[2:5]),
                       rescaler = center_around(0))+
  facet_wrap(~ hyp  ,ncol=1)

得到

【讨论】:

  • 只是出于好奇:据我了解,“fill = ..x..”表示基于 x 计数的颜色,然后被重新缩放器覆盖。有没有更简洁的方法来分配填充值?
  • 我不确定我是否理解您的问题。你是说这个方法看起来太复杂了?任何 scale_* 函数基本上都将值从“数据”空间转换为“注释”空间。这要么发生在您指定的函数或某些默认映射中。
  • 我只是想了解每个函数的作用。谢谢,这样更清楚了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多