根据注释 ggplot2 的条件创建间隔
Create intervals based on condition for annotate ggplot2
我有一个名为 ranks
的向量,其值从 -6 到 6,我想根据值间隔创建值的数量间隔,例如 (2, Inf) [2, 1.25) 等包括该区间中值的数量,加上前一个区间中的值。换句话说,对于值区间 (2, Inf) 我想获得这个区间中的值的数量加上前一个区间中的值的数量。
为此我使用了一种非常原始的方法:
xmin <- c(0, sum(ranks>2),
sum(ranks>2) + sum(ranks>1.25),
sum(ranks>2) + sum(ranks>1.25) + sum(ranks>0.75),
sum(ranks>2) + sum(ranks>1.25) + sum(ranks>0.5) + sum(ranks>0.25))
xmax <- c(c(sum(ranks>2),
sum(ranks>2) + sum(ranks>1.25),
sum(ranks>2) + sum(ranks>1.25) + sum(ranks>0.75),
sum(ranks>2) + sum(ranks>1.25) + sum(ranks>0.5) + sum(ranks>0.25))-1,
length(ranks))
其中 xmin 是每个间隔的开始,xmax 是每个间隔的结束。但我相信有一种更直接的方法可以做到这一点。
总的来说,我想找到在此间隔中分隔的值:+Inf, 2, 1, 0.5, 0, -0.5, -1, -2, -Inf
PS:我将使用这些来注释 ggplot2 中的 x 轴,如下所示(请参阅从红色到蓝色的色标,这些是具有特定 x 和 y 分隔符的矩形)
试试这个:
c(1, 1, 2, 3, 2, 1, 4, 2, 5, 6, 2, 5, 3) %>%
cut(c(0, 2, 4, 6)) %>%
table() %>%
cumsum()
(0,2] (2,4] (4,6]
7 10 13
UPD:刚刚注意到 - 您正在反向安排间隔。我认为最简单的方法是将 table 转换为数字并在 cumsum
ing
之前 rev
erse
我可能还是理解错了,不过说到底就是统计每个区间有多少个基因,对吧?
基本上你是 re-inventing 堆积条。
library(ggplot2)
# random data
set.seed(1)
rank <- sample(-6:6, 11000, replace = T)
# vector of your cuts
my_cuts <- c(-Inf, -2, -1, -0.5, 0, 0.5, 1, 2, Inf)
## make a data frame and cut the ranks
genes <- data.frame(rank)
genes$cuts <- cut(genes$rank, my_cuts)
## just use geom_bar
ggplot(genes) +
geom_bar(aes(y = 1, fill = cuts)) +
## now you can simply use one of the scale functions
scale_fill_brewer(palette = "Reds")
由 reprex package (v2.0.1)
创建于 2022-05-31
我有一个名为 ranks
的向量,其值从 -6 到 6,我想根据值间隔创建值的数量间隔,例如 (2, Inf) [2, 1.25) 等包括该区间中值的数量,加上前一个区间中的值。换句话说,对于值区间 (2, Inf) 我想获得这个区间中的值的数量加上前一个区间中的值的数量。
为此我使用了一种非常原始的方法:
xmin <- c(0, sum(ranks>2),
sum(ranks>2) + sum(ranks>1.25),
sum(ranks>2) + sum(ranks>1.25) + sum(ranks>0.75),
sum(ranks>2) + sum(ranks>1.25) + sum(ranks>0.5) + sum(ranks>0.25))
xmax <- c(c(sum(ranks>2),
sum(ranks>2) + sum(ranks>1.25),
sum(ranks>2) + sum(ranks>1.25) + sum(ranks>0.75),
sum(ranks>2) + sum(ranks>1.25) + sum(ranks>0.5) + sum(ranks>0.25))-1,
length(ranks))
其中 xmin 是每个间隔的开始,xmax 是每个间隔的结束。但我相信有一种更直接的方法可以做到这一点。
总的来说,我想找到在此间隔中分隔的值:+Inf, 2, 1, 0.5, 0, -0.5, -1, -2, -Inf
PS:我将使用这些来注释 ggplot2 中的 x 轴,如下所示(请参阅从红色到蓝色的色标,这些是具有特定 x 和 y 分隔符的矩形)
试试这个:
c(1, 1, 2, 3, 2, 1, 4, 2, 5, 6, 2, 5, 3) %>%
cut(c(0, 2, 4, 6)) %>%
table() %>%
cumsum()
(0,2] (2,4] (4,6]
7 10 13
UPD:刚刚注意到 - 您正在反向安排间隔。我认为最简单的方法是将 table 转换为数字并在 cumsum
ing
rev
erse
我可能还是理解错了,不过说到底就是统计每个区间有多少个基因,对吧?
基本上你是 re-inventing 堆积条。
library(ggplot2)
# random data
set.seed(1)
rank <- sample(-6:6, 11000, replace = T)
# vector of your cuts
my_cuts <- c(-Inf, -2, -1, -0.5, 0, 0.5, 1, 2, Inf)
## make a data frame and cut the ranks
genes <- data.frame(rank)
genes$cuts <- cut(genes$rank, my_cuts)
## just use geom_bar
ggplot(genes) +
geom_bar(aes(y = 1, fill = cuts)) +
## now you can simply use one of the scale functions
scale_fill_brewer(palette = "Reds")
由 reprex package (v2.0.1)
创建于 2022-05-31