【python】matplotlib 绘制火山图、条形图

news2024/9/24 9:22:28

文章目录

  • 火山图
  • 条形图

火山图

绘制火山图,输入是两个datafreme,行是样本名,列是基因名。使用T-test检验绘制基因表达情况。

def minmax_scale(data):
    import numpy as np
    # # 示例数据
    # data = np.array([2, 4, 6, 8, 10])

    # 进行Min-Max标准化
    min_val = np.min(data)
    max_val = np.max(data)
    scaled_data = (data - min_val) / (max_val - min_val)

    # 输出标准化后的数据
    # print("标准化后的数据:", scaled_data)
    return scaled_data


# t-test检验 表达量上调还是下调
def gene_exp(group1, group2, is_scale=False):
    from scipy import stats
    import numpy as np
    # # 两组样本数据
    # group1 = np.array([1.2, 1.5, 1.8, 2.1, 2.4])
    # group2 = np.array([0.9, 1.3, 1.6, 2.3, 2.7, 3.0])
    
    if is_scale:
        group1 = minmax_scale(group1)
        group2 = minmax_scale(group2)
    
    # 执行差异表达分析(两组独立样本的t检验)
    t_statistic, p_value = stats.ttest_ind(group1, group2, equal_var=False)

    # 设置显著性水平(例如0.05)
    alpha = 0.05

    # # 判断基因的上调或下调情况
    # fold_change = np.mean(group2) / np.mean(group1)

    # if fold_change > 1 + alpha:
    #     # print("该基因上调")
    #     return 'Up', fold_change, p_value
    # elif fold_change < 1 - alpha:
    #     # print("该基因下调")
    #     return 'Down', fold_change, p_value
    # else:
    #     # print("该基因未表现出显著的上调或下调")
    #     return 'Unknown', fold_change, p_value
    
    # 计算基因的折叠变化(fold change)
    fold_change = np.log2(np.mean(group2) / np.mean(group1))

    # 判断基因的上调或下调情况
    if fold_change > 0 and p_value < alpha:
        # regulation = 'Upregulated'
        return 'Up', fold_change, p_value
    elif fold_change < 0 and p_value < alpha:
        # regulation = 'Downregulated'
        return 'Down', fold_change, p_value
    else:
        # regulation = 'No significant change'
        return 'Unknown', fold_change, p_value

# 生成需要的颜色list
def clst(lst):
    tlst = []
    for i in lst:
        if i == 'Up':
            tlst.append('r')
        elif i == 'Down':
            tlst.append('g')
        else:
            tlst.append('k')
    return tlst

           
def data_exp(df1, df2, is_scale=False):
    """
    df1: 数据1
    df2: 数据2
    数据1和数据2 dataframe格式,行是样本名(可以是不同样本数),列是基因名(相同的列)
    """
    from collections import OrderedDict
    cols = df1.columns
    rmk_lst = []
    fc_lst = []
    pv_lst = []
    # exp_dic = OrderedDict()
    for k in cols:
        rmk, fc, pv = gene_exp(list(df1[k]), list(df2[k]), is_scale=is_scale)
        # 可能出现nan和inf
        if np.isnan(fc) or np.isnan(pv) or np.isinf(fc) or np.isinf(pv):
            print(':'.join(k)+'\t'+rmk+'\t'+str(fc)+'\t'+str(pv))
            continue
        
        rmk_lst.append(rmk)
        fc_lst.append(fc)
        pv_lst.append(pv)
        # exp_dic[k] = [rmk, pv]
        print(':'.join(k)+'\t'+rmk+'\t'+str(fc)+'\t'+str(pv))
    # return exp_dic
    return rmk_lst, fc_lst, pv_lst


def plot_volcano(fold_change, p_value, title, pltcolor=False, regulation=[]):
    # 绘制火山图
    fig, ax = plt.subplots()

    # 计算-log10(p-value)
    # neg_log_pval = -np.log10(p_value) 
    # 计算-log10(p-value),避免出现负数问题
    neg_log_pval = -np.log10(np.maximum(p_value, np.finfo(float).eps))

    # 绘制散点图
    if pltcolor:
        # 根据上调/下调与否设置点的颜色
        # colors = np.where(regulation=='Up', 'r', np.where(regulation=='Down', 'g', 'k'))
        colors = clst(regulation)
        ax.scatter(fold_change, neg_log_pval, c=colors)
    else:
        ax.scatter(fold_change, neg_log_pval) # , c=colors)

    # 设置坐标轴标签和标题
    ax.set_xlabel('Fold Change (log2)')
    ax.set_ylabel('-log10(p-value)')
    ax.set_title('Volcano Plot[%s]' % title)

    # 绘制水平线(显著性水平)
    ax.axhline(-np.log10(alpha), color='gray', linestyle='--')

    # 显示图形
    plt.show() 

使用方法:

# 获取表达上下调结果、foldchange、pvalue:
mklst, fclst, pvlst = data_exp(data_df1, data_df2, is_scale=True)

# 绘制火山图
plot_volcano(list(fclst), list(pvlst), title="mytitle", pltcolor=True, regulation=rmklst)

条形图

代码问题:左右标签没有对齐

import pandas as pd
import matplotlib.pyplot as plt

# 创建示例的 DataFrame 1
data1 = {'城市': ['北京', '上海', '广州', '深圳', '成都'],
         '人口': [2154, 2423, 1404, 1303, 1682]}
df1 = pd.DataFrame(data1)

# 创建示例的 DataFrame 2
data2 = {'城市': ['纽约', '伦敦', '巴黎', '东京', '新加坡'],
         '人口': [8537, 9304, 2141, 13929, 5894]}
df2 = pd.DataFrame(data2)

# 计算辅助变量
n = len(df1)  # 数据长度
width = 0.35  # 每个条形图的宽度

# 创建画布和主轴
fig, ax = plt.subplots(figsize=(10, 6))

# 绘制左侧的条形图
ax.barh(df1.index, df1['人口'], height=width, color='blue', label='DataFrame 1')

# 绘制右侧的条形图
ax.barh(df2.index, -df2['人口'], height=width, color='red', label='DataFrame 2')

# 设置纵坐标标签和刻度
ax.set_yticks(df1.index)
ax.set_yticklabels(df1['城市'])

# 设置右侧纵坐标标签和刻度,并逆序显示
ax2 = ax.twinx()
ax2.set_yticks(df1.index)
ax2.set_yticklabels(df2['城市'][::-1])  # 逆序显示右侧坐标标签

# 调整左右坐标轴的位置对齐
ax.tick_params(axis="y", direction="inout", length=6, pad=10)  # 左侧标签
ax2.tick_params(axis="y", direction="inout", length=6, pad=10)  # 右侧标签

# 显示图例
ax.legend()

# 显示图表
plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/696782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

go并发编程之channel

目录 1.简介 2.channel类型 无缓冲区的channel 无缓冲区channel的创建 带缓冲区的channel 带缓冲区channel的创建 3.channel使用代码演示 4.获取channel中的值 ​编辑 5.单向channel 单向发送data&#xff0c;发送到channel中 单向接收&#xff0c;channel接收数据 6…

汇编的各种指令及使用方法

***************************************************************** 汇编中的符号 1.指令&#xff1a; 能够编译生成一条32位的机器码&#xff0c;且能被CPU识别和执行 2.伪指令&#xff1a;本身不是指令&#xff0c;编译器可以将其替换成若干条等效指令 3.伪操作&#xff1a…

Linux进程间通信——管道(下)

前文 一&#xff0c;什么是命名管道? 二&#xff0c;命名管道的基本原理 三&#xff0c;创建命名管道实现两个进程对写 四&#xff0c;匿名管道和命名管道的区别 总结 前文 上篇文章我们主要讲了匿名管道的定义以及基本原理&#xff0c;但是匿名管道有一个致命的缺陷&#…

HashSet、LinkedHashSet、TreeSet有什么区别

- HashSet、LinkedHashSet 和 TreeSet 都是 Set接口的实现类&#xff0c;都能保证元素唯一&#xff0c;并且都不是线程安全的。HashSet 的底层数据结构是哈希表&#xff08;基于 HashMap 实现&#xff09;&#xff0c;元素存入和取出顺序不一致。LinkedHashSet 的底层数据结构…

C++制作五子棋

正文 01 思路 我没有选择专业的五子棋棋型&#xff0c;用我自己的逻辑&#xff08;初高中玩五子棋的方法&#xff09;&#xff0c;去实现简单的人机对战。 首先因为要计算五子棋每一步的分数&#xff0c;那么你就要分析每一步形成的棋盘&#xff0c;以下图为例&#xff1a;…

蓝桥杯专题-试题版含答案-【风险度量】【括号配对问题】【ASCII码排序】【素数求和】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

【Java高级编程】枚举类注解

枚举类&注解 1、枚举类的使用1.1、枚举类的使用1.2、如何定义枚举类1.3、Enum类的主要方法 2、注解的使用2.1、注解的概述2.2、常见的Annotation示例2.3、如何自定义注解&#xff1a;参照SuppressWarnings定义2.4、JDK提供的4种元注解2.5、JDK 8中注解的新特性&#xff1a;…

2023-06-25:redis中什么是缓存穿透?该如何解决?

2023-06-25&#xff1a;redis中什么是缓存穿透&#xff1f;该如何解决&#xff1f; 答案2023-06-25&#xff1a; 缓存穿透 缓存穿透指的是查询一个根本不存在的数据&#xff0c;在这种情况下&#xff0c;无论是缓存层还是存储层都无法命中。因此&#xff0c;每次请求都需要访…

关于C++图论树的某些题图形提示

一、去教室的路。 猫猫大学有n条路&#xff0c;每条路都有一个数字编号&#xff0c;其中的一条路一定与另外2条路相连&#xff0c;请你打出这个学校的地图。 输入1&#xff1a; 1 2 3 4 2 3 45 4 45 1 输出1&#xff1a; 1 2 3 4 5 45 图解 &#xff1…

动态住宅代理VS静态住宅代理,怎么选择?

现在&#xff0c;越来越多的海外代理服务商均支持动态住宅IP与静态住宅IP,很多小伙伴就疑惑&#xff0c;这二者有什么区别呢&#xff1f;哪个更好&#xff1f;其实&#xff0c;没有哪个更好&#xff0c;只有哪一个更合适您的业务。 无论动态住宅IP还是静态住宅IP都来自真实的住…

【软件测试】10道性能测试高频面试题,你能答上多少?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试包含了…

表格el-table多出一条横线,怎么解决(el-table表格下方多一条线的问题)

最近在写el-table表格的时候&#xff0c;发现的问题&#xff0c;表格多出一条横线&#xff0c; 可以看出其它行&#xff0c;都是正常显示&#xff0c;只有第7行多出一条横线&#xff0c;找了好久&#xff0c; 最后发现是el-table表格的伪元素&#xff0c;问题就出在这&#xf…

B站化播放量为播放时长,是谁的狂欢?

6月26日晚&#xff0c;B站举办了14周年庆典晚会。在晚会上&#xff0c;除了周深、美依礼芽同框献唱受到关注&#xff0c;B站董事长兼CEO陈睿的演讲内容同样值得深思&#xff1a; 一来&#xff0c;陈睿提到&#xff0c;要将目前B站视频前台显示的播放量数据从次数改为分钟数&am…

精进ARM计算架构,催生人工智能产业的巨大跨越

在优化ARM计算架构以支持人工智能应用方面&#xff0c;以下是一些常见的方法和技术&#xff1a; 算法和模型设计优化&#xff1a;选择合适的算法和模型结构对于在ARM架构上高效执行人工智能任务至关重要。设计轻量级的模型、减少冗余操作和参数量&#xff0c;使用适合ARM架构的…

【K8S系列】深入解析K8S调度

序言 做一件事并不难&#xff0c;难的是在于坚持。坚持一下也不难&#xff0c;难的是坚持到底。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记论点蓝色&#xff1a;用来标记论点 Kubernetes (k8s) 是一个容器编…

扩展ExtendedFloatingActionButton滚动收缩展开行为

效果 首先ExtendedFloatingActionButton有默认的Behavior : ExtendedFloatingActionButtonBehavior,这个类是为了ExtendedFloatingActionButton不被SnakBar所遮挡&#xff0c;并且这个类它是protected,所以为了保留原有的设计&#xff0c;自定义的Behavior不能在外部定义&#…

Go语言单元测试

1、Go语言单元测试 Go语言中的测试依赖 go test 命令&#xff0c;go test 命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录 内&#xff0c;所有以 _test.go 为后缀名的源代码文件都是 go test 测试的一部分&#xff0c;不会被 go build 编译到最终的可执行 文件…

【Python爬虫】利用爬虫抓取双色球开奖号码,获取完整数据,简洁45行代码实现,更新时间2023-06-28

链接&#xff1a;https://pan.baidu.com/s/18oE308_NVNPaCOACw_H5Hw?pwdabc1 利用爬虫抓取双色球开奖号码&#xff0c;获取完整数据&#xff0c;简洁45行代码实现&#xff0c;更新时间2023-06-28 这是网上的数据&#xff0c;怎么将它爬取下来 它将只爬取最近30期的双色球开…

星辰秘典:解开Python项目的神秘面纱——迷宫之星(迷宫探索与求解)

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;html css js&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;你好&#x…

文件系统理解——磁盘文件

磁盘文件 1. 问题提出2. 了解磁盘的物理结构2.1 磁盘大体结构2.2 磁盘的具体物理结构 3.对磁盘结构逻辑抽象3.1 OS是通过CSH方法进行扇区的管理的吗&#xff1f;3.2 磁盘逻辑过程 4.文件系统4.1 管理思想4.2 区结构Boot BlockSuper BlockGroup Descriptor Tableinode Table &am…