R 在ggplot2中创建具有多个方框图的地物
我在尝试使用ggplot在一个图形中绘制多个箱线图时遇到了一些问题,尽管我可以在vanilla R中轻松做到这一点。我尝试在谷歌上搜索了好几个小时的答案,但我找不到任何人有和我一样的问题 基本上,我有一个25列的数据框R 在ggplot2中创建具有多个方框图的地物,r,ggplot2,R,Ggplot2,我在尝试使用ggplot在一个图形中绘制多个箱线图时遇到了一些问题,尽管我可以在vanilla R中轻松做到这一点。我尝试在谷歌上搜索了好几个小时的答案,但我找不到任何人有和我一样的问题 基本上,我有一个25列的数据框 [1] "gene" "NumberIntrons" [3] "NumResidues" "protein_coding&quo
[1] "gene" "NumberIntrons"
[3] "NumResidues" "protein_coding"
[5] "ncRNA" "Rel_telomere"
[7] "mRNA_copies_per_cell" "protein_copies_per_cell"
[9] "mRNA.stabilities" "GeneticDiversity"
[11] "ProteinHalfLife" "Golgi"
[13] "Mitochondrion" "Nuclear_dots"
[15] "Nuclear_envelope" "Nucleolus"
[17] "Nucleus" "Vacuole"
[19] "start" "end"
[21] "solid.media.KO.fitness" "gene.expression.RPKM"
[23] "conservation.phyloP" "chromosome"
[25] "essential"
“高尔基体”、“核仁”、“核膜”、“线粒体”、“核点”、“细胞核”和“液泡”中的值为1或0,取决于该基因表达的蛋白质是否存在于该隔室中。所以现在我的问题是我想比较不同区域中蛋白质的表达率。我通过使用
subset()
函数为每个隔间创建不同的数据框来解决这个问题,以便将特定隔间中表达的所有基因放置在它们特定的数据框中。为了使用basic R创建图形,我可以简单地运行以下命令:
boxplot(log10(golgi.df$gene.expression.RPKM),
log10(mito.df$gene.expression.RPKM),
log10(nucleus.df$gene.expression.RPKM),
log10(nuc_env.df$gene.expression.RPKM),
...
这让我可以比较在每个隔间中发现的蛋白质的基因表达率。问题是,我根本不知道如何在ggplot中运行相同的命令,我不确定我是否只是遗漏了一些非常明显的东西,因为我自己无法理解,我只是找不到任何和我有类似问题的人
非常感谢你的帮助
编辑:
数据样本:
gene NumberIntrons NumResidues protein_coding ncRNA Rel_telomere
1 SPAC1002.01 1 179 1 0 0.4768186
2 SPAC1002.02 0 229 1 0 0.4770079
3 SPAC1002.03c 0 923 1 0 0.4772343
4 SPAC1002.04c 0 199 1 0 0.4782177
5 SPAC1002.05c 0 715 1 0 0.4784627
mRNA_copies_per_cell protein_copies_per_cell mRNA.stabilities
1 0.46 NA 38.30908
2 3.80 2564.51 32.34325
3 7.20 9719.87 47.75722
4 1.40 1600.25 26.73106
5 0.52 NA 20.38781
GeneticDiversity ProteinHalfLife Golgi Mitochondrion Nuclear_dots
1 0.0024331 NA 0 1 0
2 0.0025389 177.6 0 0 0
3 0.0041078 959.8 0 0 0
4 0.0043796 756.3 0 0 0
5 0.0043057 NA 0 0 0
Nuclear_envelope Nucleolus Nucleus Vacuole start end
1 0 0 0 0 1798347 1799015
2 0 0 0 0 1799061 1800053
3 0 0 0 0 1799915 1803141
4 0 0 0 0 1803624 1804491
5 0 0 1 0 1804548 1806797
solid.media.KO.fitness gene.expression.RPKM conservation.phyloP
1 1.042607 6.94700 0.0000000
2 1.095876 88.64500 0.3780292
3 1.035408 103.73833 0.5133217
4 NA 33.71667 0.5185620
5 1.056457 8.13000 0.4469873
chromosome essential
1 I NA
2 I NA
3 I NA
4 I 1
5 I NA
如果您使用ggplot并将数据转换为整齐的格式(即长格式),则可以按照注释中的建议,轻松使用ggplot一次绘制多个箱线图 我不确定我是否完全理解您的意图,但如果您希望每个对比区都有一个箱线图,结合上述对比区中所有基因的基因表达,这是一个可能的解决方案(我没有使用您的所有数据,因为以您呈现的方式将其输入R是一项相当大的努力):
@Em Laskey有你问题答案的要点。这里只是稍微长一点的演练 在这里,我创建了一个假数据集,但没有失去通用性
set.seed(1234)
df <- data.frame(gene = rep(c("A", "B"), each = 5),
Mitochondrion = rbinom(10, 1, 0.5),
Golgi = rbinom(10, 1, 0.5),
expression = runif(10, 0, 100))
df
# gene Mitochondrion Golgi expression
#1 A 0 1 31.661245
#2 A 1 1 30.269337
#3 A 1 0 15.904600
#4 A 1 1 3.999592
#5 A 1 0 21.879954
#6 B 1 1 81.059855
#7 B 0 0 52.569755
#8 B 0 0 91.465817
#9 B 1 0 83.134505
#10 B 1 0 4.577026
因此,在最初的广域格式中,每一行都包含了线粒体和高尔基体中基因存在的信息。但在长格式中,每一行只包含一个基因在一个隔间中的存在。结果,数据帧的大小增加了一倍(这里有2个隔室,在您的情况下,7个隔室将是原始大小的7倍)
从你的评论来看,你想把所有的基因混合起来。所以我们真的不需要关心基因柱的操纵。由于我们只关心基因存在的位置,因此我们可以删除Presence==0的所有观察结果。我们使用dplyr
packagefilter()
函数来实现:
df_long_pres <- df_long %>%
filter(Presence == 1)
df_long_pres
## A tibble: 11 x 4
# gene expression Compartment Presence
# <chr> <dbl> <chr> <int>
# 1 A 31.7 Golgi 1
# 2 A 30.3 Mitochondrion 1
# 3 A 30.3 Golgi 1
# 4 A 15.9 Mitochondrion 1
# 5 A 4.00 Mitochondrion 1
# 6 A 4.00 Golgi 1
# 7 A 21.9 Mitochondrion 1
# 8 B 81.1 Mitochondrion 1
# 9 B 81.1 Golgi 1
#10 B 83.1 Mitochondrion 1
#11 B 4.58 Mitochondrion 1
你能创建和共享任何样本数据吗?@DeathMetal我在主帖子中编辑了一些样本数据,我不确定这是我应该展示的方式,还是有更好的方式将其添加到帖子中?您好,欢迎访问:)请查看以下链接以查找相关指南。例如,要生成最小数据集,可以使用head()
,subset()
。然后使用dput()
给我们一些可以立即放入R的东西。或者,您可以使用基本R数据集,如mtcars
,iris
,等等。不清楚您在寻找什么样的箱线图。。。所以说在图中,它应该有7个条代表7个隔间,每个图代表一个基因?e、 g.10个基因=10个图乘以7条?或者你是把所有的基因混合在一起,单纯地观察每个隔间中所有基因的gene.expression.RPKM
分布情况?使用tidyr
和dplyr
包中的函数,你可以试着得到一个至少包含以下信息的表格:gene
,gene.expression.RPKM
和另一个带有隔间名称的。那就很容易画出地图了。基本plot
和ggplot
不使用相同类型的表来制作图形。顺便说一句,不需要分割数据。您的代码工作得很好。我真的不完全理解它是如何工作的,但现在我有了明确的方向,我应该读什么来了解更多。非常感谢。非常感谢您的详细回复,我想我理解console中发生的一切。对一个非常环保的人来说绝对是非常有帮助的。
# data I used:
> dput(dat)
structure(list(gene = structure(1:5, .Label = c("SPAC1002.01",
"SPAC1002.02", "SPAC1002.03c", "SPAC1002.04c", "SPAC1002.05c"
), class = "factor"), NumberIntrons = c(1L, 0L, 0L, 0L, 0L),
NumResidues = c(179L, 229L, 923L, 199L, 715L), protein_coding = c(1L,
1L, 1L, 1L, 1L), ncRNA = c(0L, 0L, 0L, 0L, 0L), Rel_telomere = structure(1:5, .Label = c("0.4768186",
"0.4770079", "0.4772343", "0.4782177", "0.4784627"), class = "factor"),
mRNA_copies_per_cell = structure(c(1L, 4L, 5L, 3L, 2L), .Label = c("0.46",
"0.52", "1.4", "3.8", "7.2"), class = "factor"), protein_copies_per_cell = structure(c(NA,
2L, 3L, 1L, NA), .Label = c("1600.25", "2564.51", "9719.87"
), class = "factor"), mRNA.stabilities = structure(c(4L,
3L, 5L, 2L, 1L), .Label = c("20.38781", "26.73106", "32.34325",
"38.30908", "47.75722"), class = "factor"), GeneticDiversity = structure(c(1L,
2L, 3L, 5L, 4L), .Label = c("0.0024331", "0.0025389", "0.0041078",
"0.0043057", "0.0043796"), class = "factor"), ProteinHalfLife = structure(c(NA,
1L, 3L, 2L, NA), .Label = c("177.6", "756.3", "959.8"), class = "factor"),
Golgi = c(0L, 0L, 0L, 0L, 0L), Mitochondrion = c(1L, 0L,
0L, 0L, 0L), Nuclear_dots = c(0L, 0L, 0L, 0L, 0L), solid.media.KO.fitness = structure(c(2L,
4L, 1L, NA, 3L), .Label = c("1.035408", "1.042607", "1.056457",
"1.095876"), class = "factor"), gene.expression.RPKM = structure(c(3L,
5L, 1L, 2L, 4L), .Label = c("103.73833", "33.71667", "6.947",
"8.13", "88.645"), class = "factor"), conservation.phyloP = structure(c(1L,
2L, 4L, 5L, 3L), .Label = c("0", "0.3780292", "0.4469873",
"0.5133217", "0.518562"), class = "factor")), class = "data.frame", row.names = c(NA,
-5L))
set.seed(1234)
df <- data.frame(gene = rep(c("A", "B"), each = 5),
Mitochondrion = rbinom(10, 1, 0.5),
Golgi = rbinom(10, 1, 0.5),
expression = runif(10, 0, 100))
df
# gene Mitochondrion Golgi expression
#1 A 0 1 31.661245
#2 A 1 1 30.269337
#3 A 1 0 15.904600
#4 A 1 1 3.999592
#5 A 1 0 21.879954
#6 B 1 1 81.059855
#7 B 0 0 52.569755
#8 B 0 0 91.465817
#9 B 1 0 83.134505
#10 B 1 0 4.577026
df_long <- df %>%
pivot_longer(c(Mitochondrion, Golgi),
names_to = "Compartment",
values_to = "Presence")
df_long
## A tibble: 20 x 4
# gene expression Compartment Presence
# <chr> <dbl> <chr> <int>
# 1 A 31.7 Mitochondrion 0
# 2 A 31.7 Golgi 1
# 3 A 30.3 Mitochondrion 1
# 4 A 30.3 Golgi 1
# 5 A 15.9 Mitochondrion 1
# 6 A 15.9 Golgi 0
# 7 A 4.00 Mitochondrion 1
# 8 A 4.00 Golgi 1
# 9 A 21.9 Mitochondrion 1
#10 A 21.9 Golgi 0
#11 B 81.1 Mitochondrion 1
#12 B 81.1 Golgi 1
#13 B 52.6 Mitochondrion 0
#14 B 52.6 Golgi 0
#15 B 91.5 Mitochondrion 0
#16 B 91.5 Golgi 0
#17 B 83.1 Mitochondrion 1
#18 B 83.1 Golgi 0
#19 B 4.58 Mitochondrion 1
#20 B 4.58 Golgi 0
df_long_pres <- df_long %>%
filter(Presence == 1)
df_long_pres
## A tibble: 11 x 4
# gene expression Compartment Presence
# <chr> <dbl> <chr> <int>
# 1 A 31.7 Golgi 1
# 2 A 30.3 Mitochondrion 1
# 3 A 30.3 Golgi 1
# 4 A 15.9 Mitochondrion 1
# 5 A 4.00 Mitochondrion 1
# 6 A 4.00 Golgi 1
# 7 A 21.9 Mitochondrion 1
# 8 B 81.1 Mitochondrion 1
# 9 B 81.1 Golgi 1
#10 B 83.1 Mitochondrion 1
#11 B 4.58 Mitochondrion 1
ggplot(df_long_pres) +
geom_boxplot(aes(x = Compartment, y = log10(expression)))