利用seaborn、statannotations库绘制显著性标注

news2024/12/26 11:22:34

如何使用Python-SeabornSeaborn进行显著性统计图表绘制,详细内容如下:

  • Python-Seaborn自定义函数绘制
  • Python-statannotations库添加显著性标注

1、Python-Seaborn 自定义函数绘制

import matplotlib.pylab as plt
import numpy as np
import seaborn as sns
import scipy

# ---------------------自定义P值和星号对应关系----------------------
def convert_pvalue_to_asterisks(pvalue):
    if pvalue <= 0.0001:
        return "****"
    elif pvalue <= 0.001:
        return "***"
    elif pvalue <= 0.01:
        return "**"
    elif pvalue <= 0.05:
        return "*"
    return "ns"

# ---------------------scipy.stats 计算显著性指标----------------
iris = sns.load_dataset("iris")
data_p = iris[["sepal_length","species"]]
stat,p_value = scipy.stats.ttest_ind(data_p[data_p["species"]=="setosa"]["sepal_length"],
                                     data_p[data_p["species"]=="versicolor"]["sepal_length"],
                                     equal_var=False)

# ------------------------可视化绘制---------------------------
plt.rcParams['font.family'] = ['Times New Roman']
plt.rcParams["axes.labelsize"] = 18
palette=['#0073C2FF','#EFC000FF','#868686FF']

fig,ax = plt.subplots(figsize=(5,4),dpi=100,facecolor="w")
ax = sns.barplot(x="species",y="sepal_length",data=iris,palette=palette,
                 estimator=np.mean,ci="sd", capsize=.1,errwidth=1,errcolor="k",
                 ax=ax,
                 **{"edgecolor":"k","linewidth":1})
# 添加P值
x1, x2 = 0, 1
y,h = data_p["sepal_length"].mean()+1,.2
#绘制横线位置
ax.plot([x1, x1, x2, x2], [y, y+h, y+h, y], lw=1, c="k")
#添加P值
ax.text((x1+x2)*.5, y+h, "T-test: {} ".format(p_value), ha='center', va='bottom', color="k")

ax.tick_params(which='major',direction='in',length=3,width=1.,labelsize=14,bottom=False)
for spine in ["top","left","right"]:
    ax.spines[spine].set_visible(False)
ax.spines['bottom'].set_linewidth(2)
ax.grid(axis='y',ls='--',c='gray')
ax.set_axisbelow(True)
plt.show()

2、Python-statannotations库添加显著性标注

Python-statannotations库则是针对Seaborn绘图对象进行显著性标注的专用库,其可以提供柱形图、箱线图、小提琴图等统计图表的显著性标注绘制,计算P值方法基于scipy.stats方法,这里我们简单列举几个示例演示即可,更多详细内容可参看:项目地址、使用教程 or Seaborn。

样例一:

import seaborn as sns
import matplotlib.pylab as plt
from statannotations.Annotator import Annotator

df = sns.load_dataset("tips")

x = "day"
y = "total_bill"
order = ['Sun', 'Thur', 'Fri', 'Sat']
fig,ax = plt.subplots(figsize=(5,4),dpi=100,facecolor="w")
ax = sns.boxplot(data=df, x=x, y=y, order=order,ax=ax)

pairs=[("Thur", "Fri"), ("Thur", "Sat"), ("Fri", "Sun")]
annotator = Annotator(ax, pairs, data=df, x=x, y=y, order=order)
annotator.configure(test='Mann-Whitney', text_format='star',line_height=0.03,line_width=1)
annotator.apply_and_annotate()

ax.tick_params(which='major',direction='in',length=3,width=1.,labelsize=14,bottom=False)
for spine in ["top","left","right"]:
    ax.spines[spine].set_visible(False)
ax.spines['bottom'].set_linewidth(2)
ax.grid(axis='y',ls='--',c='gray')
ax.set_axisbelow(True)
plt.show()

样例二:

import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = ['Times New Roman']
plt.rcParams["axes.labelsize"] = 18
#palette=['#0073C2FF','#EFC000FF']
palette=['#E59F01','#56B4E8']
#palette = ["white","black"]


fig,ax = plt.subplots(figsize=(5,4),dpi=100,facecolor="w")
ax = sns.barplot(x="order",y="value",hue="class",data=group_data_p,palette=palette,ci="sd",
                 capsize=.1,errwidth=1,errcolor="k",ax=ax,
                 **{"edgecolor":"k","linewidth":1})

# 添加P值
box_pairs = [(("one","type01"),("two","type01")),
             (("one","type02"),("two","type02")),
             (("one","type01"),("three","type01")),
             (("one","type02"),("three","type02")),
             (("two","type01"),("three","type01")),
             (("two","type02"),("three","type02"))]


annotator = Annotator(ax, data=group_data_p, x="order",y="value",hue="class",
                      pairs=box_pairs)
annotator.configure(test='t-test_ind', text_format='star',line_height=0.03,line_width=1)
annotator.apply_and_annotate()

样例三:如果针对组间数据进行统计分析,可以设置pairs参数据如下:

box_pairs = [(("one","type01"),("one","type02")),
             (("two","type01"),("two","type02")),
             (("three","type01"),("three","type02"))]

案例四:自定义显著性

import seaborn as sns
import matplotlib.pylab as plt
from statannotations.Annotator import Annotator

df = sns.load_dataset("tips")

x = "day"
y = "total_bill"
order = ['Sun', 'Thur', 'Fri', 'Sat']
pairs = [("Sun", "Thur"), ("Sun", "Sat"), ("Fri", "Sun")]
ax = sns.boxplot(data=df, x=x, y=y, order=order)
annot = Annotator(ax, [("Thur", "Fri"), ("Thur", "Sat"), ("Fri", "Sun")], data=df, x=x, y=y, order=order)
annot.new_plot(ax, pairs=pairs, data=df, x=x, y=y, order=order)
annot.configure(test=None, loc='inside')
annot.set_pvalues([0.1, 0.1, 0.001])
annot.annotate()
plt.show()

3、Python-statannotations库绘制显著性标注并自己设置标识

在安装的statannotations库文件夹下找到 PValueFormat.py文件并打开

找到下面这个函数,你可以通过修改这个函数添加自己想要的标识效果

4、相关性热力图自动标记显著性

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import pearsonr
import matplotlib as mpl

def cm2inch(x,y):
    return x/2.54,y/2.54

size1 = 10.5
mpl.rcParams.update(
{
'text.usetex': False,
'font.family': 'stixgeneral',
'mathtext.fontset': 'stix',
"font.family":'serif',
"font.size": size1,
"font.serif": ['Times New Roman'],
}
)
fontdict = {'weight': 'bold','size':size1,'family':'SimHei'}

df_coor=np.random.random((10,10)) # 相关性结果
fig = plt.figure(figsize=(cm2inch(16,12)))
ax1 = plt.gca()

#构造mask,去除重复数据显示
mask = np.zeros_like(df_coor)
mask[np.triu_indices_from(mask)] = True
mask2 = mask
mask = (np.flipud(mask)-1)*(-1)
mask = np.rot90(mask,k = -1)

im1 = sns.heatmap(df_coor,annot=True,cmap="RdBu"
, mask=mask#构造mask,去除重复数据显示
,vmax=1,vmin=-1
, fmt='.2f',ax = ax1)

ax1.tick_params(axis = 'both', length=0)

#计算相关性显著性并显示
rlist = []
plist = []
for i in range(df_coor.shape[0]):
    for j in range(df_coor.shape[0]):
        r,p = pearsonr(df_coor[i],df_coor[j])
        rlist.append(r)
        plist.append(p)

rarr = np.asarray(rlist).reshape(df_coor.shape[0],df_coor.shape[0])
parr = np.asarray(plist).reshape(df_coor.shape[0],df_coor.shape[0])
xlist = ax1.get_xticks()
ylist = ax1.get_yticks()

widthx = 0
widthy = -0.15

for m in ax1.get_xticks():
    for n in ax1.get_yticks():
        pv = (parr[int(m),int(n)])
        rv = (rarr[int(m),int(n)])
        if mask2[int(m),int(n)]<1.:
            if abs(rv) > 0.5:
                if  pv< 0.05 and pv>= 0.01:
                    ax1.text(n+widthx,m+widthy,'*',ha = 'center',color = 'white')
                if  pv< 0.01 and pv>= 0.001:
                    ax1.text(n+widthx,m+widthy,'**',ha = 'center',color = 'white')
                if  pv< 0.001:
                    print([int(m),int(n)])
                    ax1.text(n+widthx,m+widthy,'***',ha = 'center',color = 'white')
            else:
                if  pv< 0.05 and pv>= 0.01:
                    ax1.text(n+widthx,m+widthy,'*',ha = 'center',color = 'k')
                elif  pv< 0.01 and pv>= 0.001:
                    ax1.text(n+widthx,m+widthy,'**',ha = 'center',color = 'k')
                elif  pv< 0.001:
                    ax1.text(n+widthx,m+widthy,'***',ha = 'center',color = 'k')
plt.show()

 

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

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

相关文章

Spring Cloud组件源码之LoadBalancer源码分析

" Spring 到底是春天的来临万物复苏&#xff0c;还是春转夏的干燥又炎热呢&#xff1f;" Spring的来临让JavaEE走向了另一个高度。便捷的开发&#xff0c;完美的生态。物极必反&#xff0c;学习Spring的成本越来越低&#xff0c;导致Java程序员越来越密集&#xff0…

1、Windows下编译并搭建AzerothCore服务端

目录前言一、AzerothCore下载二、mysql安装三、boost安装四、OpenSSL安装五、CMake下载六、CMake编译1 - CMake生成vs项目2 - vs项目设置3 - 生成解决方案4 - 安装AzerothCore5 - 添加账号6 - 修改服务器名称7 - 修改客户端的服务器地址前言 客户端对应版本&#xff1a;魔兽世…

CANopen | 对象字典OD 07 - 创建对象字典变量,变量变化时发送TPDO1,滤波时间200ms

文章目录一、前言二、实验目的三、对象字典OD四、TPDO1数据变化发送&#xff0c;滤波时间200ms4.1、main.c4.2、让CANopen从站进入操作状态4.3、TPDO1的CAN数据包一、前言 该笔记的程序&#xff1a;github 二、实验目的 CANopen从站有一个变量tx_Value&#xff0c;映射到T…

我调用第三方接口遇到的13大坑

前言 在实际工作中&#xff0c;我们经常需要在项目中调用第三方API接口&#xff0c;获取数据&#xff0c;或者上报数据&#xff0c;进行数据交换和通信。 那么&#xff0c;调用第三方API接口会遇到哪些问题&#xff1f;如何解决这些问题呢&#xff1f; 这篇文章就跟大家一起…

ubuntu防火墙命令介绍

ubuntu在开启ufw防火墙前&#xff0c;为了避免与iptables现有规则冲突&#xff0c;建议先清空iptables的所有规则。相关命令如下&#xff1a; iptables -F 更改iptables规则链默认操作命令如下&#xff1a; iptables -P INPUT ACCEPTiptables -P FORWARD ACCEPTiptables -P …

【PyTorch】第一节:张量(Tensor)的定义

作者&#x1f575;️‍♂️&#xff1a;让机器理解语言か 专栏&#x1f387;&#xff1a;PyTorch 描述&#x1f3a8;&#xff1a;PyTorch 是一个基于 Torch 的 Python 开源机器学习库。 寄语&#x1f493;&#xff1a;&#x1f43e;没有白走的路&#xff0c;每一步都算数&#…

云原生网络之微隔离

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/130044619 一、微隔离介绍 1.1、微隔离概念 在主体执行动作时&#xff0c;对主体权限和行为进行判断&#xff0c;最常见的是网络访问控制&#xff0c;也就是零信任网络访问&#xff08;ZTNA&#xff…

TP5 解决如何实现生成并导出Word文档功能

今天连续更新两篇文章&#xff0c;上一篇讲了一下如何生成PDF并导出文件的功能 接下来我们就来拼一拼怎么实现生成并导出word文档的功能 话不多说 我们直接上流程&#xff1a; 1.下载安装phpword插件&#xff1a;composer require phpoffice/phpword 2.安装成功后该插件在我们项…

Linux——高级I/O操作(三)

目录 I/O多路复用 异步I/O I/O多路复用 阻塞型I/O 相对于非阻塞型 I/O 来说&#xff0c;最大的优点就是在设备的资源不可用时&#xff0c;进程主动放弃 CPU&#xff0c;让其他的进程运行&#xff0c;而不用不停地轮询&#xff0c;有助于提高整个系统的效率。但是其缺点也是比…

Sharding-JDBC之水平分表

目录一、简介1.1、垂直分表1.2、水平分表二、maven依赖三、数据库3.1、创建数据库3.2、创建表四、配置&#xff08;二选一&#xff09;4.1、properties配置4.2、yml配置五、实现5.1、实体5.2、持久层5.3、服务层5.4、测试类5.4.1、保存数据5.4.2、查询数据一、简介 1.1、垂直分…

Java入坑之注解和反射

一、注解概念0 1.1基本定义 Java注解是附加在代码中的一些元信息&#xff0c;用于一些工具在编译、运行时进行解析和使用&#xff0c;起到说明、配置的功能 1。它们可以用来标记类、方法、变量、参数和包等 简而言之&#xff0c;注解就是对于代码中某些鲜活个体的贴上去的一张…

企业如何开发自己的小程序

小程序是一种轻量级的应用程序&#xff0c;被广泛用于社交娱乐、电商购物等领域。对于企业而言&#xff0c;开发自己的小程序可以为客户提供更加个性化的服务&#xff0c;提高品牌认知度和用户忠诚度。本文将介绍企业如何开发自己的小程序&#xff0c;并通过一个具体的案例来说…

【CSS】图片底部空白缝隙处理 ( 使用居中对齐 / 顶部对齐 / 底部对齐 | 将行内元素 / 行内块元素转为块级元素 )

文章目录一、图片底部空白缝隙问题二、图片底部空白缝隙问题解决方案一 ( 使用居中对齐 / 顶部对齐 / 底部对齐 )三、图片底部空白缝隙问题解决方案二 ( 将行内元素 / 行内块元素转为块级元素 )一、图片底部空白缝隙问题 在上一篇博客中 , 使用默认的基线对齐 , 会发现 行内块级…

java 利用正则来分析日志(IT枫斗者)

利用正则来分析日志&#xff08;IT枫斗者&#xff09; 环境接口的历史并发数&#xff0c;然而运维并没有做相关的统计&#xff0c;没办法&#xff0c;只能拿到服务器近一个月的 Nginx access 日志&#xff0c;根据正则匹配所有我的接口服务的日志&#xff0c;然后统计每一秒内…

《低代码PaaS驱动集团企业数字化创新白皮书》-平台化加低代码提供破解之道(2)

平台化加低代码提供破解之道 低代码向业务的赋能&#xff1a;以效率和创新为核心&#xff0c;提升组织效率&#xff0c;促进创新&#xff0c;优化体验 通过IDC对大型企业的调研发现&#xff0c;当前拥有100个及以上应用数量的企业已经高达70%&#xff1b;IDC预测 ,2025年&…

〖Python网络爬虫实战⑮〗- pyquery的使用

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付费…

数据结构——队列(C语言实现)

队列的概念与结构 队列是一种特殊的线性结构&#xff0c;数据只能在一端插入&#xff0c;数据也只能在另一端进行删除。插入数据的那一端称之为队尾&#xff0c;插入数据的动作称之为入队。删除数据的那一端称之为队头&#xff0c;删除数据的动作称之为出列。队列遵守的是FIFO…

LeetCode 189.轮转数组

文章目录&#x1f4a1;题目分析&#x1f4a1;解题思路&#x1f6a9;思路1:暴力求解 --- 旋转k次&#x1f514;接口源码&#xff1a;&#x1f6a9;思路2:额外开数组&#x1f514;接口源码&#xff1a;&#x1f6a9;思路3:三段逆置&#x1f4cd;算法设计&#x1f514;接口源码&am…

JavaWeb开发 —— Web入门

目录 一、Spring 二、SpringBootWeb快速入门 三、HTTP协议 1. 概述 2. 请求协议 3. 响应协议 四、Web服务器 - Tomcat 1. 介绍 2. 基本使用 3. 入门程序解析 一、Spring ① 官网&#xff1a;http://spring.io ② Spring 发展到今天已经形成了一种开发生态圈&…

2022 idea 从原型创建maven项目框架--以创建niif-processors为列

目录一、idea配置二、下载archetype-catalog.xml文件三、创建设置四、创建成功截图一、idea配置 在如下两张图片花圈的位置添加如下参数 -Dmaven.wagon.http.ssl.insecuretrue -Dmaven.wagon.http.ssl.allowalltrue -Dmaven.wagon.http.ssl.ignore.validity.datestrue 二、下载…