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

用Python绘制两个标量值的热图,python,matplotlib,plot,heatmap,seaborn,Python,Matplotlib,Plot,Heatmap,Seaborn,我试图绘制两个自变量x和y的关系,用因变量得分作为热图:x和y是0到无穷大的整数值,得分是0到1之间的实值 期望的外观 x和y有大量可见值,因此我希望它看起来更像下面的示例中的典型密度图,因为每个单独x,y的精确值并不重要: 从 当前方法 目前,我正在尝试使用Seaborn函数来绘制数据,但生成的图几乎无法读取,每个离散数据点之间有大量的空间,而不是连续的梯度。使用的绘图逻辑如下所示: import pandas as pd from matplotlib.pyplot import cm im

我试图绘制两个自变量x和y的关系,用因变量得分作为热图:x和y是0到无穷大的整数值,得分是0到1之间的实值

期望的外观 x和y有大量可见值,因此我希望它看起来更像下面的示例中的典型密度图,因为每个单独x,y的精确值并不重要:

当前方法 目前,我正在尝试使用Seaborn函数来绘制数据,但生成的图几乎无法读取,每个离散数据点之间有大量的空间,而不是连续的梯度。使用的绘图逻辑如下所示:

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组成的数据之间的关系,这两个离散值表示为第三个标量值分数,以模仿梯度密度图的方式绘制?解决方案不需要使用Seaborn甚至matplotlib。

使用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')

我还添加了一个星号,表示绘图中我需要的最高点。

请使您的案例可复制,请参见。这是最小的:代码所做的唯一事情就是绘制绘图。如果在本例中使用热图而不是imshow,绘图将看起来类似,对吗?它看起来不像问题中显示的分段图。虽然这个问题对于输入数据还不够清楚,但我还是怀疑仅仅使用imshow就可以解决这个未知的问题。有时问题无法用问题中给出的信息来回答。我只是测试了@erratlinguist代码。我的矩阵很好用。可能熊猫数据没有正确转换?@Alex您的测试数据是什么样子的,例如,在列的数据类型方面?我使用的是一个数组float64@errantlinguist这很有趣;你是在回应我试图在这里帮助你的企图,只是对我无动于衷;然而,从您向回答此问题的用户询问其输入数据的事实来看,您甚至承认这确实取决于输入数据。我不知道我会怎么称呼那些期望从别人那里得到他们自己不愿意提供的东西的人,但是你在上面的三条评论中给出了一些选择。