使用 viridis 和 Map 值在直方图中着色
Use viridis and Map values to colour in a histogram plot
我正在尝试重新创建左侧的两个图:
颜色渐变应该在 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_gradientn
,有一个重新缩放函数可以将您的观察值映射到 [0,1] 以便进行着色。您可以创建自己的缩放器以在中间放置一个特定的数字。例如
center_around <- function(center=0) {
function(x, to=NA, from=NA) {
r <- max(abs(from-center))
(x - (center-r)) / 2/r
}
}
将 return 一个函数,该函数将以给定数字为中心的值然后重新调整为 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)
得到
我正在尝试重新创建左侧的两个图:
颜色渐变应该在 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_gradientn
,有一个重新缩放函数可以将您的观察值映射到 [0,1] 以便进行着色。您可以创建自己的缩放器以在中间放置一个特定的数字。例如
center_around <- function(center=0) {
function(x, to=NA, from=NA) {
r <- max(abs(from-center))
(x - (center-r)) / 2/r
}
}
将 return 一个函数,该函数将以给定数字为中心的值然后重新调整为 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)
得到