在python中使用matplotlib制作自定义色彩映射表

时间:2014-07-28 14:51:27

标签: python matplotlib heatmap colorbar colormap

我有一张我用matplotlib显示的图片。

enter image description here

图像由以下代码生成:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm


labels = ['Name1', 'Name2', 'Name3', 'Name4', 'Name5', 'Name6']

data = np.array(
 [[ 0.000, 0.120, 0.043, 0.094, 0.037, 0.045],
  [ 0.120, 0.000, 0.108, 0.107, 0.105, 0.108],
  [ 0.043, 0.108, 0.000, 0.083, 0.043, 0.042],
  [ 0.094, 0.107, 0.083, 0.000, 0.083, 0.089],
  [ 0.037, 0.105, 0.043, 0.083, 0.000, 2.440],
  [ 0.045, 0.108, 0.042, 0.089, 2.440, 0.000]])


mask =  np.tri(data.shape[0], k=-1)
data = np.ma.array(data, mask=mask) # Mask out the lower triangle of data.

fig, ax = plt.subplots(sharex=True)
im = ax.pcolor(data, edgecolors='black', linewidths=0.3)

# Format
fig = plt.gcf()
fig.set_size_inches(10, 10)

ax.set_yticks(np.arange(data.shape[0]) + 0.5, minor=False)
ax.set_xticks(np.arange(data.shape[1]) + 0.5, minor=False)

# Turn off the frame.
ax.set_frame_on(False)
ax.set_aspect('equal')  # Ensure heatmap cells are square.

# Want a more natural, table-like display.
ax.invert_yaxis()
ax.yaxis.tick_right()
ax.xaxis.tick_top()

ax.set_xticklabels(labels, minor=False)
ax.set_yticklabels(labels, minor=False)

# Rotate the upper labels.
plt.xticks(rotation=90)
ax.grid(False)
ax = plt.gca()

for t in ax.xaxis.get_major_ticks():
    t.tick1On = False
    t.tick2On = False
for t in ax.yaxis.get_major_ticks():
    t.tick1On = False
    t.tick2On = False

fig.colorbar(im)

fig.savefig('out.png', transparent=False, bbox_inches='tight', pad_inches=0)

我想应用自定义色彩映射以便值:

  • 在0-1之间是蓝色和白色的线性渐变
  • 在1-3之间 白色和红色的线性渐变。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:16)

这样做的方法不止一种。在您的情况下,最简单的方法是使用LinearSegmentedColormap.from_list并指定颜色的相对位置以及颜色名称。 (如果您有均匀间隔的更改,则可以跳过元组并执行from_list('my cmap', ['blue', 'white', 'red'])。)然后,您需要为数据指定手动最小值和最大值(vmin和{{1 } kwargs到vmax / imshow / etc)。

举个例子:

pcolor

enter image description here

答案 1 :(得分:2)

这听起来像seismic colormap

您可能希望强制使用最小值和最大值来使中间变为白色。