Python 热图 : Change colour map and make asymmetrical

标签 python pandas matplotlib heatmap

我想构建此数据的热图:

curation1       curation2       overlap
1      2      0
1      3      1098
1      4      11
1      5      137
1      6      105
1      7      338
2      3      351
2      4      0
2      5      1
2      6      0
2      7      0
3      4      132
3      5      215
3      6      91
3      7      191
4      5      6
4      6      10
4      7      19
5      6      37
5      7      95
6      7     146

我用这段代码做了一个热图:

import sys
import pandas as pd
import matplotlib
matplotlib.use('Agg')
import matplotlib.ticker as ticker
import matplotlib.cm as cm
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
from matplotlib import colors

data_raw = pd.read_csv(sys.argv[1],sep = '\t')
data_raw["curation1"] = pd.Categorical(data_raw["curation1"], data_raw.curation1.unique())
data_raw["curation2"] = pd.Categorical(data_raw["curation2"], data_raw.curation2.unique())
data_matrix = data_raw.pivot("curation1", "curation2", "overlap")

fig = plt.figure()
fig, ax = plt.subplots(1,1, figsize=(12,12))
heatplot = ax.imshow(data_matrix,cmap = 'BuPu')
#ax.set_xticklabels(data_matrix.columns)
#ax.set_yticklabels(data_matrix.index)
tick_spacing = 1
#ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
#ax.yaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
ax.set_title("Overlap")
fig.savefig('output.pdf')

输出如下所示:this

我有三个问题:

  1. 您可以看到配色方案有点“偏离”,因为大多数数据的颜色都非常浅,并且有一个随机的紫色框表示“0”。理想情况下,我希望这张热图是不同深浅的绿色,最深的绿色是最高的数字,最亮(但仍然清晰可见)的绿色是最低的数字。我试着玩弄“cmap”论点,例如如 python 教程 here 中所述将其更改为“冬季” ;但我做错了什么。有人可以告诉我具体在哪里可以更改吗?

  2. color bar:我想加一个color bar,但我想我需要先理清问题1。

  3. 不对称:如您所见,该图是不对称的。是否可以绘制一半的热图(例如,去掉不必要的线,并可能将轴标签移动到图的右侧?;如果不是,这没什么大不了的,因为我可以重新调整它在 powerpoint 中)。

最佳答案

这将解决您的前两个问题 -

fig = plt.figure()
fig, ax = plt.subplots(1,1, figsize=(12,12))
heatplot = ax.imshow(data_matrix,cmap = 'Greens')

cbar = fig.colorbar(heatplot, ticks=[data_raw.overlap.min(), data_raw.overlap.max()])
tick_spacing = 1
ax.set_title("Overlap")

关于Python 热图 : Change colour map and make asymmetrical,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49530746/

相关文章:

python - 强制在 Python 中创建目录

python - 模块 Flask 登录时出错

python - 解析多个 "msg"文件并将正文存储在csv文件中

python - 通过对 pandas 数据框中的奇数行和偶数行使用不同的条件来生成新列

python - 如何使用 lxml 在属性值中设置 namespace 前缀?

python - 将一列中的数组值转换为原始 DataFrame 的列的最佳方法是什么?

python - 条件选择是否保留 Pandas DataFrame 中的顺序?

python - 如何更正确地近似点

python - 绘制二维数组的曲面图

python - 带 datetime64[ns] 轴的 Matplotlib 多彩线