草庐IT

统计绘图 | 这个能不能作为【火山图】?

shwzhao 2023-03-28 原文

1. 火山图?

之前瞥到了小明的 跟着Cell学作图:R语言ggplot2作图展示差异表达的基因,但没有细看,根据印象做了下面这个图。

  • 差异表达结果合并
awk 'NR==1{print}FNR>1{print}' *vs0.txt > allvs0.txt
  • 在 R 中读取
library(tidyverse)
df_deg <- read_tsv("allvs0.txt")
  • 作图,其中
    不显示padj大于0.5的基因;
    df_degcontrast 列:1vs0 | 2vs0 | 3vs0 | 4vs0 | 5vs0,不同的组的差异表达结果;
    df_degchange列:Up | Down | Stable,可根据log2FoldChangepadj定义;
    my_gene 是我想突出的基因构成的向量。
ggplot(filter(df_deg, padj <= 0.05 & !geneids %in% my_genes)) +
  geom_point(aes(contrast, log2FoldChange, color = change, size = -log10(padj), alpha = -log10(padj)),
             # size = 3,
             position = "jitter") +
  geom_point(data = filter(df_deg, (log2FoldChange >= 1 | log2FoldChange <= -1) & padj <= 0.05 & geneids %in% my_genes),
             aes(contrast, log2FoldChange), # size = -log10(padj)
             position = "jitter",
             size = 4,
             shape = 21,
             color = "black",
             fill = "#fee08b") +
  # ylim(-15, 15) +
  geom_hline(yintercept = c(-1, 1), 
             linetype = 'dotdash',
             color = 'grey30') +
  scale_color_manual(values = c(Up = "#e6550d", Down = "#3182bd", Stable = "#636363")) +
  scale_alpha(range = c(0.3, 1)) +
  labs(x = 'Group', y = 'Log2(fold change)') +
  theme_bw()
image.png

2. 常规火山图

  • 只选择一个差异表达结果
library(tidyverse)
library(ggrepel)

df_deg <- read_tsv("1vs0.txt")

ggplot(df_deg) +
  geom_point(aes(log2FoldChange, -log10(padj), color = change),
             show.legend = F) +
  geom_point(data = filter(df_deg, (log2FoldChange >= 1 | log2FoldChange <= -1) & padj <= 0.05 & geneids %in% my_genes),
             aes(log2FoldChange, -log10(padj)),
             # shape = 21,
             # fill = "black",
             color = "#fee08b") +
  geom_text_repel(data = filter(df_deg, (log2FoldChange >= 1 | log2FoldChange <= -1) & padj <= 0.05 & geneids %in% my_genes),
                  aes(log2FoldChange, -log10(padj)),
                  label = "^-^",
                  box.padding = 0.5,
                  max.overlaps = Inf) +
  scale_color_manual(values = c(Up = "#e6550d", Down = "#3182bd", Stable = "#636363")) +
  geom_hline(yintercept = -log10(0.05), 
             linetype = 'dotdash',
             color = 'grey30') +
  geom_vline(xintercept = c(-1, 1), 
             linetype = 'dotdash',
             color = 'grey30') +
  labs(x = 'Log2(fold change)', y = '-log10(p-value)') +
  xlim(-10, 10) +
  ylim(0, 30) +
  theme_bw()
image.png

3. 倾斜火山图

  • 这个啊,应该叫做【热狗图】。

公众号 | 生信宝典 | 什么是倾斜45度的火山图?
简书 | 小明的数据分析笔记本 | 跟着Nature Plants学作图:R语言ggplot2画变种火山图

有关统计绘图 | 这个能不能作为【火山图】?的更多相关文章

  1. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  2. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  3. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  4. ruby-on-rails - 应用程序的名称是否可以作为变量使用? - 2

    当我创建一个Rails应用程序时,控制台:railsnewfoo我的代码可以使用字符串“foo”吗?puts"Yourapp'snameis"+app_name_bar 最佳答案 Rails.application.class将为您提供应用程序的全名(例如YourAppName::Application)。从那里您可以使用Rails.application.class.parent获取模块名称。 关于ruby-on-rails-应用程序的名称是否可以作为变量使用?,我们在StackOve

  5. ruby-on-rails - 使用作为方法的值在 ruby​​ 中搜索哈希 - 2

    我在搜索我的值是方法的散列时遇到问题。我只是不想运行plan_type与键匹配的方法。defmethod(plan_type,plan,user){foo:plan_is_foo(plan,user),bar:plan_is_bar(plan,user),waa:plan_is_waa(plan,user),har:plan_is_har(user)}[plan_type]end目前如果我传入“bar”作为plan_type,所有方法都会运行,我怎么能只运行plan_is_bar方法呢? 最佳答案 这个变体怎么样?defmethod

  6. ruby - 无法在 Ruby 中将 ffmpeg 作为子进程运行 - 2

    我正在尝试使用以下代码通过将ffmpeg实用程序作为子进程运行并获取其输出并解析它来确定视频分辨率:IO.popen'ffmpeg-i'+path_to_filedo|ffmpegIO|#myparsegoeshereend...但是ffmpeg输出仍然连接到标准输出并且ffmepgIO.readlines是空的。ffmpeg实用程序是否需要一些特殊处理?或者还有其他方法可以获得ffmpeg输出吗?我在WinXP和FedoraLinux下测试了这段代码-结果是一样的。 最佳答案 要跟进mouviciel的评论,您需要使用类似pope

  7. ruby - 这个 ruby​​ 注入(inject)魔术是如何工作的? - 2

    我今天看到了一个ruby​​代码片段。[1,2,3,4,5,6,7].inject(:+)=>28[1,2,3,4,5,6,7].inject(:*)=>5040这里的注入(inject)和之前看到的完全不一样,比如[1,2,3,4,5,6,7].inject{|sum,x|sum+x}请解释一下它是如何工作的? 最佳答案 没有魔法,符号(方法)只是可能的参数之一。这是来自文档:#enum.inject(initial,sym)=>obj#enum.inject(sym)=>obj#enum.inject(initial){|mem

  8. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  9. ruby - 如何跳过 CSV 文件的第一行并将第二行作为标题 - 2

    有没有办法跳过CSV文件的第一行,让第二行作为标题?我有一个CSV文件,第一行是日期,第二行是标题,所以我需要能够在遍历它时跳过第一行。我尝试使用slice但它会将CSV转换为数组,我真的很想将其读取为CSV,以便我可以利用header。 最佳答案 根据您的数据,您可以使用另一种方法和skip_lines-option此示例跳过所有以#开头的行require'csv'CSV.parse(DATA.read,:col_sep=>';',:headers=>true,:skip_lines=>/^#/#Markcomments!)do|

  10. ruby-on-rails - Ruby rand() 不能接受变量? - 2

    我对此有点困惑。我在RoR项目中的最终目标是从我的数据库中获取单个随机配置文件。我想它应该是这样的:@profile=Profile.find_by_user_id(rand(User.count))它一直抛出错误,因为user_id0不存在,所以我把它的一部分拿出来检查发生了什么:@r=rand(User.count)每次都返回0。发生什么了?我注册了5个假用户和5个相关配置文件来测试这个。如果我将Profile.find_by_user_id(rand(User.count))重写为Profile.find_by_user_id(3)它工作得很好。User.count也在工作。所以

随机推荐