如何为我的DataFrame创建具有离散颜色图例的热图?

时间:2017-11-06 17:51:11

标签: python pandas matplotlib seaborn

我有这个DataFrame df

df = pd.DataFrame(columns=["System","F1", "F2", "F3", "F4"], 
                  data=[["System1",0,1,0,0],
                        ["System2",0,1,0,0]])

我想创建一个"热图"海鲈:

plt.figure(figsize=(12,6))
ax = sns.heatmap(df, annot=False, linewidths=.5, cmap="Set3")
plt.ylabel('Features', fontsize=12)
plt.xlabel('Systems', fontsize=12)
plt.xticks(rotation='vertical')
plt.yticks(rotation='horizontal')
plt.show()

在X轴上我想拥有系统,而在Y轴我希望拥有功能。如果System-Feature值为0,则颜色为深蓝色,否则为浅蓝色。

我该怎么做?

2 个答案:

答案 0 :(得分:3)

sns.heatmap

这样的东西
sns.heatmap(df.set_index('System'))

为了控制颜色

from matplotlib import colors
cmap = colors.ListedColormap(['darkblue','blue'])
sns.heatmap(df.set_index('System'),cmap=cmap)

控制颜色

from matplotlib import colors
cmap = colors.ListedColormap(['darkblue','blue'])
bounds=[0, 1,99]
norm = colors.BoundaryNorm(bounds, cmap.N)
sns.heatmap(df.set_index('System'),cmap=cmap,norm =norm )

答案 1 :(得分:1)

修改

反转色彩图可以解决将较暗颜色指定为较小值的问题。根据ypur要求添加图例也有所涉及。我不认为他们在另一个(原始)问题中提到过。

f . g

如果值是二进制的,我不认为实际上需要使用热图。您可以使用plt.imshow()并根据您的要求设置刻度值。然后你还必须绘制像素边界 - 这有点像重新发明轮子。

plt.imshow()

使用this answer和一些扩充来显示补丁。

df.set_index('System', inplace=True)

plt.figure()
im = plt.imshow(df.values.T, cmap='Blues_r')

ax = plt.gca();

# Playing around with the ticks
ax.set_xticks(np.arange(0, df.shape[0], 1));
ax.set_yticks(np.arange(0, df.shape[1], 1));


# dataframe columns and index values as tick labels
ax.set_xticklabels(df.index.get_values());
ax.set_yticklabels(df.columns);

# to draw the grid lines
ax.set_xticks(np.arange(-.5, df.shape[0], 1), minor=True);
ax.set_yticks(np.arange(-.5, df.shape[1], 1), minor=True);

ax.grid(which='minor', color='b')

plt.ylabel('Features', fontsize=12)
plt.xlabel('Systems', fontsize=12)

![enter image description here

import matplotlib.patches as mpatches values = np.unique(df.values.ravel()) colors = [ im.cmap(im.norm(value)) for value in values] patches = [ mpatches.Patch(color=colors[i], label="{l}".format(l=values[i]) , edgecolor='b' ) for i in range(len(values)) ] legend=plt.legend(handles=patches, bbox_to_anchor=(1.05, 1),loc=2, borderaxespad=0.5, frameon=True) frame = legend.get_frame() # to add a frame frame.set_facecolor('grey') plt.show()

(未完成答案)

sns.heatmap()

enter image description here