【问题标题】:Plotting a matrix in python在python中绘制矩阵
【发布时间】:2021-11-08 01:04:22
【问题描述】:

我有一个看起来像这样的熊猫数据框:

gene1   gene2        pvalue        qvalue
TP53.   FUBP1       6.381282e-09.  2.435575e-08
TP53.    CIC        1.570489e-22.  7.055298e-22
IDH1.    NF1        1.946551e-05.  7.116265e-05

我想要一个如下图所示的矩阵:

所以我要绘制一个矩阵,其中基因名称为行和列,并且仅对在上面的 pandas 数据框中找到基因对的那些细胞着色。我怎样才能在熊猫中实现这一点。我们将不胜感激。

【问题讨论】:

标签: python-3.x pandas matplotlib seaborn


【解决方案1】:

这是一个工作版本:

import seaborn as sns

# cleanup
df['pvalue'] = df['pvalue'].str[:-1].astype(float)
df['gene1']  = df['gene1'].str[:-1]

idx = sorted(set(df['gene1']).union(df['gene2']))
df2 = (df.pivot(index='gene1', columns='gene2', values='pvalue')
         .reindex(index=idx, columns=idx)
      )

mask = df2.isna()&np.isnan(df2.T.values) # keep track of NAs on both combinations of genes (A/B and B/A)

df2 = df2.fillna(0)
df2 += df2.values.T  # fill matrix A/B → B/A
df2 = df2.mask(mask) # restore NAs

cmap = sns.diverging_palette(323, 101, s=60, as_cmap=True)
ax = sns.heatmap(data=-np.log10(df2), mask=np.triu(df2.values), center=0, cmap=cmap)
ax.invert_yaxis()
ax.xaxis.tick_top()

输出:

【讨论】:

  • 它完全符合我的要求。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-03-31
  • 2016-12-08
  • 2015-09-21
  • 2020-03-20
  • 2014-10-19
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多