首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用viridis和Map值在直方图图中着色

使用viridis和Map值在直方图图中着色
EN

Stack Overflow用户
提问于 2018-06-11 20:33:48
回答 1查看 1.2K关注 0票数 4

我试图重新创建左边的两个情节:颜色梯度应该在0处较轻,在极值时则更暗。我想使用viridis包来创建颜色梯度。

下面是我的示例数据集:

代码语言:javascript
复制
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有关。

代码语言:javascript
复制
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)

这给了我这个输出:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-11 21:00:02

对于scale_fill_gradientn,有一个重新标度函数,它将您观察到的值映射为0,1,以便进行着色。您可以创建自己的重新分频器,将某个数字放置在中间。例如

代码语言:javascript
复制
center_around <- function(center=0) {
  function(x, to=NA, from=NA) {
    r <- max(abs(from-center))
    (x - (center-r)) / 2/r
  }
}

将返回一个函数,该函数将值以给定的数字为中心,然后再降为0,1。

代码语言:javascript
复制
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)

要获得

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50805606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档