【问题标题】:I'm having trouble using ggplot2 to reproduce a violin plot我无法使用 ggplot2 重现小提琴情节
【发布时间】:2019-06-27 20:53:33
【问题描述】:

我的数据包括每个样本的几个基因的突变组合、计数和筛选细菌的抗生素的 MIC(这些是离散的)。

这是玩具数据:

structure(list(count = c(4L, 26L, 96L, 93L, 2L, 22L), combo = structure(c(22L, 
19L, 2L, 2L, 20L, 19L), .Label = c("HFALSEAIVTANGGAL", "HFALSEAIVTANGGAP", 
"HFALSEAIVTANGGTP", "HFALSEAIVTANSGAP", "HFALSEAIVTAYGGTP", "HFALSEAIVTTNSGAP", 
"HFALSEAIVTVNGGAL", "HFALSEAIVTVNGGAS", "HFALSEAIVTVNSGAP", "HFALSEAMTTAYGSAA", 
"HFALSEAMTTAYGSAP", "HFALSEAMTTAYGSTP", "HTRUEAIVSANGGAP", "HTRUEAIVTANGGAP", 
"HTRUEAIVTANSGAP", "HTRUEAIVTTNSGAP", "HTRUEAMTTAYGSAP", "YFALSEAIVTANGGAL", 
"YFALSEAIVTANGGAP", "YFALSEAIVTANGGAS", "YFALSEAIVTANSGAP", "YFALSEAIVTTNGGAL", 
"YFALSEAIVTTNGGAP", "YFALSEAIVTTNSGAP", "YFALSEAIVTVNGGAL", "YFALSEAMTTANGGAP", 
"YFALSEAMTTANGGTP", "YFALSEAMTTAYGSAA", "YFALSEAMTTAYGSAP", "YFALSEAMTTAYGSAS", 
"YFALSEAMTTAYGSTP", "YFALSENFNFNFNFNFNFNFNFNFNF", "YTRUEAIVTANGGAL", 
"YTRUEAIVTANGGAP", "YTRUEAMTTAYGSAP"), class = "factor")), row.names = c(NA, 
6L), class = "data.frame")

每个 MIC 类别都如此(在 log2 范围内有 8 个)。

我正在尝试创建这样的小提琴情节(来源:https://www.thelancet.com/journals/laninf/article/PIIS1473-3099(18)30225-1/fulltext ):

我试图写一些代码,但没有走多远:

p <- ggplot(mydata, aes(factor(combo), y=mic)) + 
  geom_violin() +
  geom_boxplot(width=.01, outlier.size=0, fill="grey50") +
  stat_summary(fun.y=median, geom="point", fill="white", shape=21, size=4)
p

这个情节是这样的:

我可以轻松地创建一个计数表,但我希望有一些视觉效果,如下图所示。有人可以引导我朝着正确的方向前进吗?

p <- ggplot(mydata, aes(x = combo, y=mic)) 
p + geom_violin()  + geom_jitter(height = 0, width = 0.1, aes(color=factor(combo)))

【问题讨论】:

  • 您展示的示例图表使用对数刻度作为 y 轴。尝试将+ scale_y_continuous(trans = "log") 添加到您的情节中。
  • @Gregor 似乎对 MIC 值取幂,但总体数字没有变化。
  • 如果这不起作用,而不是共享您的数据图片,您能否以复制/粘贴格式(dput() 最好)共享您的数据的一小部分样本,以便我们可以在提出建议之前自己尝试解决方案?
  • 按照建议添加了 dput()。
  • ggplot2.tidyverse.org/reference/geom_violin.html 添加点尝试尝试:p + geom_violin() + geom_jitter(height = 0, width = 0.1, aes(color=factor(combo)))

标签: r ggplot2


【解决方案1】:

我无法重现您的绘图代码,因为它缺少 mic 列。但是,我认为这就是您要寻找的:

# load libraries
library(ggplot2)
library(ggforce)

# make toy data
set.seed(1); a <- data.frame(kind = sample(letters[1:10], 500, TRUE), value = sample(1:20, 500, TRUE))

# plot
ggplot(a, aes(x = kind, y = value, colour = kind))+geom_violin()+geom_sina(size = 2.1)

当然,您可以使用这种格式(geom_sina 调用中的点大小最明显)。

编辑

# redefine the first plot, removing the legend:
p1 <- ggplot(a, aes(x = kind, y = value, colour = kind))+
  geom_violin()+
  geom_sina(size = 1.1)+
  theme(legend.position = "none")

# Define toy data for the lower plot:
library(data.table)
set.seed(1)
Genes <- data.table(gene = sample(LETTERS[1:10], 20, TRUE), 
                    n = sample(1:10, 20, TRUE))

# add a coloring variable
Genes[, coloring := cut(n, 3, labels = 1:3)]

# plot the lower plot
p2 <- ggplot(Genes, aes(n, gene, colour = coloring))+
  geom_point(size = 2.8)+
  theme(axis.title = element_blank(), 
        axis.text.x = element_blank(), 
        legend.position = "none", 
        axis.ticks.x = element_blank(), 
        panel.background = element_blank())

# put both plots in the canvas:
library(patchwork)
p1+
 p2+
 plot_layout(ncol = 1, heights = c(.8, .2))

产生:

【讨论】:

  • x 轴需要什么?
  • 我可以看到在 y 轴上有一些名称(我想是基因)。这些点似乎代表某物的存在与否,但那个变量是什么?
  • 我正在努力弄清楚如何编码基因的存在与否。 X 轴上的每个基因似乎都由一种颜色表示,它与小提琴图相匹配,绘制在 Y 轴 MIC 值上。如果我将 X 轴设为基因的组合(例如:ABDFJ),那么它会被一种颜色着色,但它不会与下面的图匹配。 @PavoDive
  • 嗯...在我看来,您最大的问题是您没有完全理解您要模仿的情节,因此很难确定缺少什么.一旦你确定你需要什么,请建议。我很乐意提供帮助
  • 我需要文章图中底部的基因列表来匹配主图中小提琴图的颜色。在文章图中,x 轴似乎是突变的组合。然而,下图并未显示突变的组合,而是将这种组​​合分解为单个基因突变。除非有办法在 X 轴上绘制每个基因突变?感谢您的帮助@PavoDive
【解决方案2】:

很长一段时间过去了,现在有一个名为ggupsetR 包,它制作的图表类似于《柳叶刀》中链接的图表。

https://github.com/const-ae/ggupset

绘制一个组合矩阵而不是标准 x 轴,并使用 ggplot2 创建 UpSet 图

【讨论】:

    猜你喜欢
    • 2020-03-09
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2018-05-15
    • 1970-01-01
    相关资源
    最近更新 更多