R ggplot2:如何根据不同的列制作直方图和颜色?
R ggplot2: How to make a histogram and color according to diferent columns?
我正在尝试生成一个 histogram with some data, but I can't find a way to make ggplot2 作品来实现我想要的。
对于上下文,我的数据如下所示:(列名)
​
| Name | Total Enrichment % (A+B+C+D) | %A | %B | %C | %D |
我想生成一个直方图,显示总富集列的分布,然后用 4 种颜色填充该列,显示 A、B、C 和 D 的不同百分比。
我已经尝试将数据转换为长格式,但我似乎仍然无法得到我想要的。
任何建议都会很有帮助!非常感谢!
这里有一个例子(不是原始数据,只是其中的一小部分):
dat <- read.table(text = "Name Total A B C D
1 0.1396104 0.029220779 0.009740260 0.029220779 0.07142857
2 0.1250000 0.010869565 0.021739130 0.016304348 0.07608696
3 0.1337580 0.006369427 0.000000000 0.025477707 0.10191083
4 0.1239669 0.016528926 0.024793388 0.033057851 0.04958678
5 0.1242938 0.011299435 0.016949153 0.039548023 0.05649718
6 0.1311475 0.000000000 0.000000000 0.021857923 0.10928962
7 0.1376147 0.004587156 0.004587156 0.004587156 0.12385321
8 0.1574074 0.046296296 0.018518519 0.032407407 0.06018519
9 0.1269036 0.010152284 0.010152284 0.020304569 0.08629442", sep = "", header=T)
我的目标是创建一个包含总富集数据的直方图,但每一列都填充了其他贡献变量(A、B、C 和 D)
谢谢!
编辑
感谢 StupidWolf 的帮助和评论,我可以更接近我想要的东西。
这是我到目前为止所看到的(它并不完美,但到目前为止还不错)
我想做的是让 y 轴为对数刻度,因为我有很多较低范围的数据,而且我也对更丰富的数据感兴趣。
另外,有谁知道为什么没有填充条形图?为什么会有这些空白?
再次感谢您的帮助和耐心等待!
我正在对你想要做什么进行有根据的猜测,首先让我们获取一些数据:
set.seed(321)
library(ggplot2)
library(dplyr)
dat = data.frame(Name=1:500,matrix(runif(500*4),ncol=4))
colnames(dat)[-1] = LETTERS[1:4]
dat$Total = rowSums(dat[,-1])
如果要计算A,B,C,D对Total的每个分箱值的贡献,那么我们需要做Total的直方图,看起来是这样的,我们存储breaks来分类每个行:
his_all = hist(dat$Total,br=40)
dat$bin = cut(dat$Total,br=his_all$breaks,labels=his_all$mids)
在上面,我用柱状图的中间代表位置来再次绘制柱状图。因此有一个将因子标签转换为数字的步骤。然后我们需要计算 A 到 D 对每个总数的贡献,然后旋转更长的时间并绘制 :
dat %>%
mutate_at(c("A","B","C","D"),~.x/Total) %>%
pivot_longer(A:D) %>%
mutate(bin=as.numeric(as.character(bin))) %>%
ggplot(aes(x=bin,y=value,fill=name)) +
geom_col() +
xlab("enrichment")
另一种可视化数据的方法:
dat$interval = cut_interval(dat$Total,5)
dat %>% mutate_at(c("A","B","C","D"),~.x/Total) %>%
group_by(interval) %>% select(c(interval,A:D)) %>%
summarize_all(mean) %>% pivot_longer(-interval) %>%
ggplot(aes(x=interval,y=value,fill=name)) + geom_col()
这会向您显示总计的每个范围,A/B/C/D 的贡献比例..
我正在尝试生成一个 histogram with some data, but I can't find a way to make ggplot2 作品来实现我想要的。
对于上下文,我的数据如下所示:(列名)
​
| Name | Total Enrichment % (A+B+C+D) | %A | %B | %C | %D |
我想生成一个直方图,显示总富集列的分布,然后用 4 种颜色填充该列,显示 A、B、C 和 D 的不同百分比。
我已经尝试将数据转换为长格式,但我似乎仍然无法得到我想要的。
任何建议都会很有帮助!非常感谢!
这里有一个例子(不是原始数据,只是其中的一小部分):
dat <- read.table(text = "Name Total A B C D
1 0.1396104 0.029220779 0.009740260 0.029220779 0.07142857
2 0.1250000 0.010869565 0.021739130 0.016304348 0.07608696
3 0.1337580 0.006369427 0.000000000 0.025477707 0.10191083
4 0.1239669 0.016528926 0.024793388 0.033057851 0.04958678
5 0.1242938 0.011299435 0.016949153 0.039548023 0.05649718
6 0.1311475 0.000000000 0.000000000 0.021857923 0.10928962
7 0.1376147 0.004587156 0.004587156 0.004587156 0.12385321
8 0.1574074 0.046296296 0.018518519 0.032407407 0.06018519
9 0.1269036 0.010152284 0.010152284 0.020304569 0.08629442", sep = "", header=T)
我的目标是创建一个包含总富集数据的直方图,但每一列都填充了其他贡献变量(A、B、C 和 D)
谢谢!
编辑
感谢 StupidWolf 的帮助和评论,我可以更接近我想要的东西。
这是我到目前为止所看到的(它并不完美,但到目前为止还不错)
我想做的是让 y 轴为对数刻度,因为我有很多较低范围的数据,而且我也对更丰富的数据感兴趣。 另外,有谁知道为什么没有填充条形图?为什么会有这些空白?
再次感谢您的帮助和耐心等待!
我正在对你想要做什么进行有根据的猜测,首先让我们获取一些数据:
set.seed(321)
library(ggplot2)
library(dplyr)
dat = data.frame(Name=1:500,matrix(runif(500*4),ncol=4))
colnames(dat)[-1] = LETTERS[1:4]
dat$Total = rowSums(dat[,-1])
如果要计算A,B,C,D对Total的每个分箱值的贡献,那么我们需要做Total的直方图,看起来是这样的,我们存储breaks来分类每个行:
his_all = hist(dat$Total,br=40)
dat$bin = cut(dat$Total,br=his_all$breaks,labels=his_all$mids)
在上面,我用柱状图的中间代表位置来再次绘制柱状图。因此有一个将因子标签转换为数字的步骤。然后我们需要计算 A 到 D 对每个总数的贡献,然后旋转更长的时间并绘制 :
dat %>%
mutate_at(c("A","B","C","D"),~.x/Total) %>%
pivot_longer(A:D) %>%
mutate(bin=as.numeric(as.character(bin))) %>%
ggplot(aes(x=bin,y=value,fill=name)) +
geom_col() +
xlab("enrichment")
另一种可视化数据的方法:
dat$interval = cut_interval(dat$Total,5)
dat %>% mutate_at(c("A","B","C","D"),~.x/Total) %>%
group_by(interval) %>% select(c(interval,A:D)) %>%
summarize_all(mean) %>% pivot_longer(-interval) %>%
ggplot(aes(x=interval,y=value,fill=name)) + geom_col()
这会向您显示总计的每个范围,A/B/C/D 的贡献比例..