【问题标题】:R ggplot2: How to make a histogram and color according to diferent columns?R ggplot2:如何根据不同的列制作直方图和颜色?
【发布时间】:2020-05-30 05:07:33
【问题描述】:

我正在尝试使用一些数据生成,但我找不到使 工作以实现我想要的方法。

对于上下文,我的数据如下所示:(列名)

​

|  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 的惊人帮助和 cmets,我可以更接近我想要的。

这是我到目前为止所得到的(它并不完美,但到目前为止还不错)

我想做的是将 y 轴设为对数刻度,因为我有很多较低范围内的数据,而且我对丰富度较高的数据也很感兴趣。 另外,有谁知道为什么酒吧没有填满?为什么会有这些空白?

再次感谢您的帮助和耐心等待!

【问题讨论】:

  • 查找堆积条形图。
  • 提供dput()格式的数据。
  • See here 提出一个人们可以帮助解决的 R 问题。这包括数据样本、所有必要的代码,以及对无效内容的清晰说明。
  • 根据@camille 评论,需要更多详细信息才能准确了解您想要做什么,但示例 4 似乎是您想要做的:ggplot2.tidyverse.org/reference/geom_histogram.html

标签: histogram ggplot2 r ggplot2 histogram data-visualization


【解决方案1】:

我正在对您想要做什么进行有根据的猜测,首先让我们获取一些数据:

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 的每个 binned 值的贡献,那么我们需要做一个 Total 的直方图,它看起来像这样,我们存储断点以对每一行进行分类:

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()

这显示了 Total 的每个范围,A/B/C/D 的贡献比例是多少..

【讨论】:

  • 这很有用!但是,我在将它与我的数据一起使用时遇到了一些问题......首先,我无法找到一种方法来制作像上一个那样的直方图,但使用对数刻度并遵循与您展示的相同的步骤.. . 有什么方法可以在不拧紧所有直方图的情况下使 y 轴成为对数刻度?我试过 scale_y_log() 但结果没有意义......
  • 好吧,它没有做太多...(见帖子):)
  • 好的,我现在知道了。抱歉,我读得太快了,尽管您需要 x 轴上的东西。你的情节对于 log y 轴没有意义......因为如果你上升一个 log 比例,增量是乘法的,这使得堆叠超级混乱。与其想出一些情节,我不得不告诉你这将是错误的..
  • 我明白了……这很有意义!有什么办法可以绘制它吗?也许另一种方式来可视化它?因为我唯一想到的就是拆分数据并分别绘制高富集和低富集...但这并不理想...
  • 将你的值分成分位数/六分位数并显示比例?因此,如果有效果,您将看到情节一侧的丰富。即您显示两个图,一个是整体直方图,第二个显示分布
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 2023-03-04
  • 1970-01-01
  • 2016-01-02
  • 2020-07-03
  • 1970-01-01
  • 2010-12-05
相关资源
最近更新 更多