我想用Python(seaborn、matplotlib等)制作一个具有二维信息的热图。我有一个想要分配给颜色的分类值,以及一个想要分配给透明度的连续变量(即 0-100 或 0-1 之间),因此每个框都有自己的颜色和透明度(或强度)。
例如:
colors = pd.DataFrame([['b','g','r'],['black','orange','purple'],['r','yellow','white']])
transparency = pd.DataFrame([[0.1,0.2,0.3],[0.9,0.1,0.2],[0.1,0.6,0.3]])
如何根据这些数据制作热图,使左上角的框颜色为蓝色,透明度为 10%(或不透明度为 10%,以两者为准),依此类推?
到目前为止,我最好的想法是将颜色转换为整数值,将它们添加到透明度值,然后制作自定义颜色图,其中每个整数具有不同的颜色,范围从白色到整数值之间的颜色。这听起来很复杂,我希望有一种内置的方法可以做到这一点。有什么想法吗?
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle, Patch
import pandas as pd
colors = pd.DataFrame([['b', 'g', 'r'], ['black', 'orange', 'purple'], ['r', 'yellow', 'white']])
transparency = pd.DataFrame([[0.1, 0.2, 0.3], [0.9, 0.1, 0.2], [0.1, 0.6, 0.3]])
fig, ax = plt.subplots()
for i, (color_col, transp_col) in enumerate(zip(colors.columns, transparency.columns)):
for j, (color, transp) in enumerate(zip(colors[color_col], transparency[transp_col])):
ax.add_patch(Rectangle((i - 0.5, j - 0.5), 1, 1,
facecolor=color, alpha=transp, edgecolor='none', lw=0))
ax.invert_yaxis() # start at the top
ax.autoscale(enable=True, tight=True) # recalculate axis limits
ax.set_xticks(range(len(colors.columns)), colors.columns)
ax.set_yticks(range(len(colors.index)), colors.index)
plt.show()