这是我现在的画图脚本,我原来是通过热图肉眼来判断是否有影响的,但是作为科研论文这不好下结论,需要在此...
Created on: March 29, 2025
Created on: March 29, 2025
这是我现在的画图脚本,我原来是通过热图肉眼来判断是否有影响的,但是作为科研论文这不好下结论,需要在此基础上进行优化,要在我原有画图的脚本基础上进行更改,我的数据格式已经固定,现在的脚本不能通过统计学来判断样本间是否存在差异,需要增加统计学的判断依据,尽可能简单直白,优先考虑生命科学常用的方法,两个样本间是否存在差异,dataframe中的['db1_ratio']和['db2_ratio']一个是野生型一个是突变体,现在有一些突变体肉眼看均匀的分布在对角线上,不知道是否是真的没影响还是与野生型比增加或减少,我需要你给我增加一些有说服力的参考客观进行评判,避免主观臆断:
def plot_cleavage_ratio(data1,lable1):
x = data1['db2_ratio']
y = data1['db1_ratio']
xy = np.vstack([x,y])
z = gaussian_kde(xy)(xy)
idx = z.argsort()
x, y, z = x.iloc[idx], y.iloc[idx], z[idx]
plt.xlabel(lable1)
ax = plt.gca()
plt.plot([0, 1], [0, 1], ls='--', color='#555555')
#ax.plot(0.164179,0.280000, marker='*',color='w',markersize=5)
xticks = np.array([0.00,0.25,0.5,0.75,1.00])
plt.xticks(xticks)
scatter = ax.scatter(x,y,marker='o',c=z,s=5,cmap="RdYlBu_r",label='LST')
divider = make_axes_locatable(ax)
textsns.despine(top=True, right=True) return ax
我原来是用下面脚本调用我原有的画图函数的,现在我应该如何修改来调用你更新的函数:plt.figure(figsize=(12, 12))
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3,hspace=0.3)
plt.subplot(4,4,1)
plot_cleavage_ratio(fy_rep2_cleavage,'')
#plt.yticks(color='w')
#plt.xticks(color='w')
plt.subplot(4,4,2)
plot_cleavage_ratio(cpsf30_rep2_cleavage,'')
#plt.yticks(color='w')
#plt.xticks(color='w')
plt.subplot(4,4,3)
plot_cleavage_ratio(fip1_rep2_cleavage,'')
#plt.yticks(color='w')
#plt.xticks(color='w')
plt.subplot(4,4,4)
plot_cleavage_ratio(esp5_rep2_cleavage,'')
#plt.xticks(color='w')
#plt.yticks(color='w')
plt.subplot(4,4,5)
plot_cleavage_ratio(fpa_rep1_cleavage,'')
#plt.yticks(color='w')
#plt.xticks(color='w')
plt.subplot(4,4,6)
plot_cleavage_ratio(fca_rep2_cleavage,'')
#plt.yticks(color='w')
#plt.xticks(color='w')
plt.subplot(4,4,7)
plot_cleavage_ratio(paps1_rep2_cleavage,'')
#plt.yticks(color='w')
#plt.xticks(color='w')
plt.subplot(4,4,8)
plot_cleavage_ratio(paps24_rep2_cleavage,'')
#plt.yticks(color='w')
#plt.xticks(color='w')
plt.subplot(4,4,9)
plot_cleavage_ratio(cstf64_rep2_cleavage,'')
#plt.xticks(color='w')
#plt.yticks(color='w')
plt.subplot(4,4,10)
plot_cleavage_ratio(cstf77_rep2_cleavage,'')
#plt.xticks(color='w')
#plt.yticks(color='w')
plt.subplot(4,4,11)
plot_cleavage_ratio(pcfs4_rep2_cleavage,'')
#plt.yticks(color='w')
#plt.xticks(color='w')
plt.subplot(4,4,12)
plot_cleavage_ratio(bdr123_rep2_cleavage,'')
#plt.yticks(color='w')
#plt.xticks(color='w')
plt.subplot(4,4,13)
plot_cleavage_ratio(ssu72_rep2_cleavage,'')
#plt.yticks(color='w')
#plt.xticks(color='w')
plt.subplot(4,4,14)
plot_cleavage_ratio(xrn3_rep2_GB_cleavage,'')
#plt.yticks(color='w')
#plt.xticks(color='w')
sns.despine(top=True, right=True)
下面的思路供你参考,核心是:
下面给出一个示例,假设你希望进行Mann-Whitney U检验,并且将显著性水平和p值标注到图上。为了尽量保持你现有函数调用方式不变,我们把新的函数也命名为 plot_cleavage_ratio
,你只需要替换原来的函数定义,然后在你的脚本中直接使用即可。
pythonimport numpy as np import matplotlib.pyplot as plt import seaborn as sns from scipy.stats import gaussian_kde, mannwhitneyu from mpl_toolkits.axes_grid1 import make_axes_locatable def plot_cleavage_ratio(data1, label1): """ data1: 包含 'db2_ratio' (突变体) 和 'db1_ratio' (野生型) 的 DataFrame label1: x轴或者其他用于区分的label """ # 取出两个需要比较的列 x = data1['db2_ratio'].dropna() # 假设这是突变体 y = data1['db1_ratio'].dropna() # 假设这是野生型 # 计算二维核密度并进行散点排序,以实现“由低密度到高密度”层叠 xy = np.vstack([x, y]) z = gaussian_kde(xy)(xy) idx = z.argsort() x, y, z = x.iloc[idx], y.iloc[idx], z[idx] # 绘图 ax = plt.gca() scatter = ax.scatter(x, y, marker='o', c=z, s=5, cmap="RdYlBu_r") plt.plot([0, 1], [0, 1], ls='--', color='#555555') xticks = np.array([0.00, 0.25, 0.50, 0.75, 1.00]) plt.xticks(xticks) plt.xlabel(label1) plt.ylabel("WildType" if label1 else "") # 也可以根据需要修改 # 添加右侧colorbar(如果需要的话) divider = make_axes_locatable(ax) cax = divider.append_axes("right", size="3%", pad=0.1) cbar = plt.colorbar(scatter, cax=cax) cbar.set_label('Density') # =============== 统计学检验 =============== # 使用 Mann-Whitney U 检验 # 适合非正态分布的情况。如果你确认正态性,也可以用 t-test。 stat_val, p_val = mannwhitneyu(x, y, alternative='two-sided') # 这里仅举例返回 p 值; 相对坐标,可根据美观需要自行调整 text_y = 0.95 ax.text(text_x, text_y, f"Mann-Whitney U\np={p_val:.2e}", ha='left', va='top', transform=ax.transAxes, fontsize=10, bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="black", alpha=0.5)) # 去掉顶部与右侧边框 sns.despine(top=True, right=True) return ax
U
,第二个是p值。这里我们只在图中标注了p值,你可以根据需要把U值也标注上去或在函数中print
出来。from scipy.stats import ttest_ind
并调用 ttest_ind(x,y)
来得到 t-statistic 和 p-value。你给出的旧脚本里,本质就是循环/分块画子图,并调用 plot_cleavage_ratio(...)
函数。现在只要确保你把上述新函数(已经加入统计学部分)替换掉原先的老函数,然后其他调用部分无需做额外改动即可。示例如下:
pythonplt.figure(figsize=(12, 12)) plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0.3) plt.subplot(4, 4, 1) plot_cleavage_ratio(fy_rep2_cleavage, '') # 这里label1你可以随意写 plt.subplot(4, 4, 2) plot_cleavage_ratio(cpsf30_rep2_cleavage, '') plt.subplot(4, 4, 3) plot_cleavage_ratio(fip1_rep2_cleavage, '') plt.subplot(4, 4, 4) plot_cleavage_ratio(esp5_rep2_cleavage, '') # ... 后面依次类推 # 如果某张子图的xy轴标签太挤,你可以在plot_cleavage_ratio里加一些x_label和y_label控制 sns.despine(top=True, right=True) plt.show()
这样你就可以像原来一样,一次性把多张子图画出来,并且每张图都会在右上角显示基于 Mann-Whitney U 检验得到的 p 值,从而能提供一个客观的统计学判断,帮助避免仅靠“肉眼判断差异”带来的主观问题。
多重检验修正:
如果你一次画了很多子图(比如对多个突变体分别做了野生型 vs. 突变体的比较),那就涉及到重复统计检验的问题,可以考虑使用 statsmodels.stats.multitest
库对得到的一批 p 值做多重检验修正(FDR, Bonferroni 等)。
展示分布差异的其他形式:
换用 Kolmogorov-Smirnov test (KS 检验):
from scipy.stats import ks_2samp
来做 KS 检验。返回的统计量stat_val
表示两个分布累积分布函数最大的差异处,p值表示其显著性。总之,上面给出的示例函数足以满足“大多数生命科学文章中对两组样本是否存在显著差异的需求”,并能直接嵌入你的原绘图脚本中使用。你只需将其复制进你的脚本并使用,即可得到兼具可视化与统计判断的结果。祝你科研顺利!