Python 如何为我的数据框创建带有离散颜色图例的热图?

Python 如何为我的数据框创建带有离散颜色图例的热图?,python,pandas,matplotlib,seaborn,Python,Pandas,Matplotlib,Seaborn,我有这个数据帧df: df = pd.DataFrame(columns=["System","F1", "F2", "F3", "F4"], data=[["System1",0,1,0,0], ["System2",0,1,0,0]]) 我想创建seaborn的“热图”: plt.figure(figsize=(12,6)) ax = sns.heatmap(df, annot=False, linewi

我有这个数据帧
df

df = pd.DataFrame(columns=["System","F1", "F2", "F3", "F4"], 
                  data=[["System1",0,1,0,0],
                        ["System2",0,1,0,0]])
我想创建seaborn的“热图”:

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轴我想要特征。如果系统特征值为0,则颜色为深蓝色,否则为浅蓝色


我怎么做呢?

类似于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 )

类似于
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 )
编辑:

反转颜色贴图将解决将较暗颜色指定给较小值的问题。根据ypur要求添加图例也有一定的难度。我认为在另一个(原始)问题中没有提到它们


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

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)
使用和一些增强来显示修补程序

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()
(回答不完整)

编辑:

反转颜色贴图将解决将较暗颜色指定给较小值的问题。根据ypur要求添加图例也有一定的难度。我认为在另一个(原始)问题中没有提到它们


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

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)
使用和一些增强来显示修补程序

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()
(回答不完整)



好的,谢谢。设置索引有帮助。但是,如何设置颜色?默认情况下,我得到右边的颜色图例,它包含渐变。我只想要两种颜色:一种用于
0
,另一种用于
1
@degonalius使用cmap控制颜色,更新如何更改渐变颜色图例?它应该只说“暗蓝色:1”和“蓝色:0”@Diologius update:-)它对我不起作用。我看到0,然后是一个很大的差距,然后是80,60,40,20的颜色渐变图例。好的,谢谢。设置索引有帮助。但是,如何设置颜色?默认情况下,我得到右边的颜色图例,它包含渐变。我只想要两种颜色:一种用于
0
,另一种用于
1
@degonalius使用cmap控制颜色,更新如何更改渐变颜色图例?它应该只说“暗蓝色:1”和“蓝色:0”@Diologius update:-)它对我不起作用。我看到0,然后是一个很大的间隙,然后是颜色渐变图例中的80、60、40、20。它没有给出X轴上的系统和Y轴上的特征。此外,在这种情况下如何控制颜色?您可以手动设置勾号标签,并且必须使用cmap参数。我将在短时间内更新它。@这是您想要的绘图吗?是的,但我还需要颜色图例。请使用
sns.heatmap()查看我的编辑。
。不知道如何使用
plt.imshow
实现这一点,它没有在X轴提供系统,在Y轴提供功能。此外,在这种情况下如何控制颜色?您可以手动设置勾号标签,并且必须使用cmap参数。我将在短时间内更新它。@这是您想要的绘图吗?是的,但我还需要颜色图例。请使用
sns.heatmap()查看我的编辑。
。不确定如何使用
plt.imshow