使用Python绘制两个标量值的热图

时间:2018-02-07 11:15:43

标签: python matplotlib plot heatmap seaborn

我正在尝试将两个自变量xy与因变量score的关系绘制为热图:xy是0到无穷大的整数值,score是介于0和1之间的实数值。

期望的外观

xy有很多看见的值,所以我希望看起来更像典型的密度图,如下例所示,因为每个人的确切值(x, y)不是很重要:

Example desired output

(取自Seaborn's documentation

目前的方法

目前,我正在尝试使用Seaborn的heatmap(..)函数绘制数据,但结果图几乎不可读,每个离散数据点之间有大量空间而不是“连续”渐变。使用的绘图逻辑如下:

import pandas as pd
from matplotlib.pyplot import cm
import seaborn as sns

sns.set_style("whitegrid")

df = read_df_using_pandas(...)
table = df.pivot_table(
    values="score",
    index="y",
    columns="x", aggfunc='mean')
ax = sns.heatmap(table, cmap=cm.magma_r)
ax.invert_yaxis()
fig = sns_plot.get_figure()
fig.savefig("some_outfile.png", format="png")

结果图如下所示,这是错误的,因为它与上一节中描述的所需外观不匹配: Heatmap produced by code

我不知道为什么每个离散数据点之间存在大量空间而不是“连续”渐变。如何绘制由两个离散值组成的数据之间的关系( xy)表示为第三个标量值(score),模仿渐变密度图的样式?该解决方案无需使用Seaborn甚至matplotlib。

1 个答案:

答案 0 :(得分:1)

使用imshow

一个适用于我的示例,其中'toplot'是一个包含您想要热图的值的矩阵:

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(6,6))
plt.clf()        

ax = fig.add_subplot(111)
toplot = INSERT MATRIX HERE
res = ax.imshow(toplot, cmap=plt.cm.viridis, vmin = 0)    
cb = fig.colorbar(res,fraction=0.046, pad=0.04)


plt.title('Heatmap')

plt.xlabel('x-axis')
plt.ylabel('y-axis')

row = np.where(toplot == toplot.max())[0][0]
column= np.where(toplot == toplot.max())[1][0]

plt.plot(column,row,'*')

plt.savefig('plots/heatmap.png', format='png')

我还添加了一个星星,表示我需要的情节中的最高点。