我有一个具有不同组的数据帧(‘Label’列).对于每个标签,我希望绘制从 bootstrap 获得的空分布(值在‘NULL’列中),并在顶部绘制真实的统计数据(在‘sc’列中的值).理想情况下,我希望统计后的区域有不同的 colored颜色 ,以标记这是我的p值.这能用stat_density_ridges美元实现吗?

以下是R代码的一个示例:

library(ggplot2)
library(tidyverse)
library(ggridges)

df <- data.frame()

for (label in LETTERS) {
  mean=rnorm(1,0.5,0.2)
  null = rnorm(1000,mean,0.1);
  sc = rnorm(1,0.5,0.2)
  df <- rbind(df, data.frame(label=label, null=null, sc=sc))
}

df <- df %>% 
  mutate(label=as.factor(label))

ggplot(df, aes(x = null, y = label))  +
  stat_density_ridges(scale=1.2,alpha = 1, size=1)+
  scale_x_continuous(limits=c(0,1),breaks=seq(0,1,0.2)) +
  geom_segment(aes(x=sc, xend=sc, y=as.numeric(label)-0.1, yend=as.numeric(label)+0.5), size=1) +
  coord_flip()

由此得出的数字如下:

ridge plot

但理想情况下,我希望每个山脊更像这样:

enter image description here

其中 colored颜色 在sc值之后改变.这有可能吗? 谢谢:)

推荐答案

您可以使用fill..x..在您的曲线图的fixed x值处创建不同的 colored颜色 .因此,阴影区域在所有地块上都是相同的.您可以通过将ggplot_build与单独的数据帧一起使用来修改它,该数据帧具有作为阈值的p值.因此,有了这些阈值,您可以有条件地更改层中的color.以下是一些可重现的代码:

library(ggplot2)
library(tidyverse)
library(ggridges)

df <- data.frame()

set.seed(7) # for reproducibility
for (label in LETTERS) {
  mean=rnorm(1,0.5,0.2)
  null = rnorm(1000,mean,0.1);
  sc = rnorm(1,0.5,0.2)
  df <- rbind(df, data.frame(label=label, null=null, sc=sc))
}

df <- df %>% 
  mutate(label=as.factor(label))
# Create dataframe with p_values ranges per label
p_values = df %>% 
  group_by(label) %>% 
  summarise(p_value = unique(sc)) %>%
  mutate(label = as.integer(label)) # make sure label is the same as in ggplot_build

# plot
p <- ggplot(df, aes(x = null, y = label, fill = ifelse(..x.. < sc, "no sign", "sign"), group = factor(label)))  +
  stat_density_ridges(geom = "density_ridges_gradient",,
                      scale=1.2,alpha = 1, size=1,
                      calc_ecdf = TRUE) +
  scale_fill_manual(values = c("red", "blue"), name = "") +
  coord_flip()
p
#> Picking joint bandwidth of 0.0224

# Modify layer
q <- ggplot_build(p)
#> Picking joint bandwidth of 0.0224
q$data[[1]] = q$data[[1]] %>%
  left_join(., p_values,
            by = c("group" = "label")) %>%
  mutate(fill = case_when(x < p_value ~ fill,
                          TRUE ~ "blue")) %>%
  select(-p_value)
q <- ggplot_gtable(q)
plot(q)

创建于2023-03-28年第reprex v2.0.2

正如您在最新的图表中看到的,阴影区域现在根据每个组的数据帧的sc值.

R相关问答推荐

如何删除R中除某些特定名称外的所有字符串?

更改编号列表的 colored颜色

矩阵%*%矩阵中的错误:需要数字/复杂矩阵/向量参数

基于多列将值链接到NA

将数据集中的值增加到当前包含的最大值

R-更新面内部的栅格值

在R中使用download. file().奇怪的URL?

使用列/行匹配将两个不同维度的矩阵相加

将小数分隔符放在R中的前两位数字之后

在数组索引上复制矩阵时出错

在使用bslb和bootstrap5时,有没有办法更改特定dt行的 colored颜色 ?

在R函数中使用加号

查找所有站点的最小值

WRS2包中带有bwtrim的简单ANOVA抛出错误

为什么函数toTitleCase不能处理english(1),而toupper可以?

如何为混合模型输出绘制不同的线型?

在生成打印的自定义函数中,可以通过变量将线型或 colored颜色 设置为NULL吗?

将每晚的平均值与每晚的值进行比较,统计是否有效?

同时使用Scale_y_Break和Scale_x_Continue时,X轴值出现两次

通过判断行的值将数据从宽格式转换为长格式