我正在尝试将两个自变量x
和y
与因变量score
的关系绘制为热图:x
和y
是0到无穷大的整数值,score
是介于0和1之间的实数值。
x
和y
有很多看见的值,所以我希望看起来更像典型的密度图,如下例所示,因为每个人的确切值(x, y)
不是很重要:
目前,我正在尝试使用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")
结果图如下所示,这是错误的,因为它与上一节中描述的所需外观不匹配:
我不知道为什么每个离散数据点之间存在大量空间而不是“连续”渐变。如何绘制由两个离散值组成的数据之间的关系( x
和y
)表示为第三个标量值(score
),模仿渐变密度图的样式?该解决方案无需使用Seaborn甚至matplotlib。
答案 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')
我还添加了一个星星,表示我需要的情节中的最高点。