[英]How to group already stacked bars when using R ggplot and geom_bar
我在 R 中使用以下myggdf
数据框
structure(list(Signature = c(1L, 3L, 5L, 1L, 3L, 5L, 1L, 3L,
5L, 1L, 3L, 5L), Sample = structure(c(1L, 1L, 1L, 2L, 2L, 2L,
3L, 3L, 3L, 4L, 4L, 4L), .Label = c("F.vcf", "G.vcf", "H.vcf",
"I.vcf"), class = "factor"), Contribution = c(638.885179211473,
403.558378092796, 237.864729405206, 621.475592580731, 507.076811680132,
844.111458945023, 340.773496994329, 693.189161464458, 868.648293203769,
350.293155215537, 796.162462388531, 393.009724831982), label = c("lung",
"lung", "lung", "lung", "lung", "lung", "ovary", "ovary", "ovary",
"ovary", "ovary", "ovary")), row.names = c(NA, -12L), class = "data.frame")
Signature Sample Contribution label
1 1 F.vcf 638.8852 lung
2 3 F.vcf 403.5584 lung
3 5 F.vcf 237.8647 lung
4 1 G.vcf 621.4756 lung
5 3 G.vcf 507.0768 lung
6 5 G.vcf 844.1115 lung
7 1 H.vcf 340.7735 ovary
8 3 H.vcf 693.1892 ovary
9 5 H.vcf 868.6483 ovary
10 1 I.vcf 350.2932 ovary
11 3 I.vcf 796.1625 ovary
12 5 I.vcf 393.0097 ovary
并且希望将数据显示为每个样本的堆叠条(每个签名的贡献),此外还按标签(组织类型)分组。
使用以下代码
ggplot(myggdf, aes(x=Sample, y=Contribution, fill=as.factor(Signature))) +
+ geom_bar(stat="identity", position='stack') + facet_grid(~label)
返回这个与我期望的不太远的图。
但是,如何获得仅在其适当方面显示的样本?
请注意,我并没有那么执着于刻面显示。 如果有办法在同一个面板中按标签对堆叠的条形进行聚类,那就太好了。
感谢您的任何提示
也许一种选择是使用这样的interaction()
。 您也可以在facet_*()
函数中启用scales
选项以像 @stefan 那样重塑轴。 这里的代码:
#Code
ggplot(myggdf, aes(x=interaction(Sample,label), y=Contribution, fill=as.factor(Signature))) +
geom_bar(stat="identity", position='stack')
输出:
带有 facet 的选项意味着创建新的变量,如下所示:
library(tidyverse)
#Data and plot
myggdf %>%
mutate(Var='var',Newlabel=paste0(Sample,'-',label)) %>%
ggplot(aes(x=Var, y=Contribution, fill=as.factor(Signature))) +
geom_bar(stat="identity", position='stack')+
facet_wrap(.~Newlabel,scales='free')
输出:
如果只需要一行绘图,下一个代码可能很有用:
#Data and plot 2
myggdf %>%
mutate(Var='var',Newlabel=paste0(Sample,'-',label)) %>%
ggplot(aes(x=Var, y=Contribution, fill=as.factor(Signature))) +
geom_bar(stat="identity", position='stack')+
facet_wrap(.~Newlabel,scales='free_x',nrow = 1)
输出:
使用的一些数据:
#Data
myggdf <- structure(list(Signature = c(1L, 3L, 5L, 1L, 3L, 5L, 1L, 3L,
5L, 1L, 3L, 5L), Sample = c("F.vcf", "F.vcf", "F.vcf", "G.vcf",
"G.vcf", "G.vcf", "H.vcf", "H.vcf", "H.vcf", "I.vcf", "I.vcf",
"I.vcf"), Contribution = c(638.8852, 403.5584, 237.8647, 621.4756,
507.0768, 844.1115, 340.7735, 693.1892, 868.6483, 350.2932, 796.1625,
393.0097), label = c("lung", "lung", "lung", "lung", "lung",
"lung", "ovary", "ovary", "ovary", "ovary", "ovary", "ovary")), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))
更新:为了更好地区别轴,可以像这样自定义标签:
#Data and plot 3
myggdf %>%
mutate(Newlabel=paste0(Sample,' (',label,')')) %>%
ggplot(aes(x=Newlabel, y=Contribution, fill=as.factor(Signature))) +
geom_bar(stat="identity", position='stack')+
xlab('Sample-Tissue')
输出:
一种选择是将scales="free_x"
添加到facet_grid
:
library(ggplot2)
myggdf <- structure(list(Signature = c(1L, 3L, 5L, 1L, 3L, 5L, 1L, 3L,
5L, 1L, 3L, 5L), Sample = c("F.vcf", "F.vcf", "F.vcf", "G.vcf",
"G.vcf", "G.vcf", "H.vcf", "H.vcf", "H.vcf", "I.vcf", "I.vcf",
"I.vcf"), Contribution = c(638.8852, 403.5584, 237.8647, 621.4756,
507.0768, 844.1115, 340.7735, 693.1892, 868.6483, 350.2932, 796.1625,
393.0097), label = c("lung", "lung", "lung", "lung", "lung",
"lung", "ovary", "ovary", "ovary", "ovary", "ovary", "ovary")), row.names = c(NA,
-12L), class = "data.frame")
ggplot(myggdf, aes(x=Sample, y=Contribution, fill=as.factor(Signature))) +
geom_bar(stat="identity", position='stack') + facet_grid(~label, scales = "free_x")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.