Python 绘制热图时对数据进行排序

Python 绘制热图时对数据进行排序,python,matplotlib,heatmap,Python,Matplotlib,Heatmap,我一直在尝试绘制一张热图,x轴上有一个时间跨度(以5分钟为增量),y轴上有一段在互联网上观看的视频 一切进展顺利,数据也很好。例如,数据集可能如下所示: [[0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.5, 0.0, 0.0, 1.5, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0

我一直在尝试绘制一张热图,x轴上有一个时间跨度(以5分钟为增量),y轴上有一段在互联网上观看的视频

一切进展顺利,数据也很好。例如,数据集可能如下所示:

[[0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.5, 0.0, 0.0, 1.5, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]
这意味着有两行22列(0:00:00-1:45:00)

我正在使用此代码绘制热图:

def printheatmap(title,names,data):
    data = np.array(data)
    fig, ax = plt.subplots()
    fig = plt.gcf()
    fig.set_size_inches(8, 11)
    heatmap = ax.pcolormesh(data, cmap=plt.cm.Blues, edgecolors='black')
    ax.set_title(title)
    ax.set_xticks(np.arange(data.shape[1])+0.5, minor=False)
    ax.set_yticks(np.arange(data.shape[0])+0.5, minor=False)
    ax.xaxis.tick_bottom()
    ax.set_xticklabels(times, minor=False,  weight='ultralight', rotation=40, ha='right')
    ax.set_yticklabels(names, minor=False)
    ax.grid(False)
    plt.colorbar(heatmap)
    plt.show()
但由于某些原因,第二行首先在热图中绘制:

def printheatmap(title,names,data):
    data = np.array(data)
    fig, ax = plt.subplots()
    fig = plt.gcf()
    fig.set_size_inches(8, 11)
    heatmap = ax.pcolormesh(data, cmap=plt.cm.Blues, edgecolors='black')
    ax.set_title(title)
    ax.set_xticks(np.arange(data.shape[1])+0.5, minor=False)
    ax.set_yticks(np.arange(data.shape[0])+0.5, minor=False)
    ax.xaxis.tick_bottom()
    ax.set_xticklabels(times, minor=False,  weight='ultralight', rotation=40, ha='right')
    ax.set_yticklabels(names, minor=False)
    ax.grid(False)
    plt.colorbar(heatmap)
    plt.show()

如您所见,以(0.5;0;0;1.5)开头的标签位于图表顶部,标签正确。是否有任何方法可以“保留”我正在手动进行的排序

y轴没有反转。对于较大的数据集,绘图似乎完全随机(但显然,最高分数在底部),而最后一行应该是:

[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0].

这是另一张照片。我按日期对数据集进行了排序,但它只是将其置乱:


编辑:修正了。显然,使用自定义XPath函数对数据进行排序并不能很好地与matplotlib配合使用。手动排序似乎可以做到这一点。

使用列表切片来反转数据:

data = np.array(data[::-1])
或反转Y轴:

ax.invert_yaxis()

看起来Y轴不是倒的。数据集越大,数据的混乱程度就越高,似乎将总数最高的数据放在了底部。请看我编辑的帖子。@MatsWillemsen实际上我知道你说的“排序”是什么意思,你显示的样本数据没有排序,是吗?事实上是这样。按日期排序(不包括在数据中);但我现在把它修好了!如上所示。@MatsWillemsen,那么当反转yaxis时什么是“混乱的”?哦,我的道歉。反转y轴不会使数据更加混乱,但这是我必须做的事情,以使其符合我的要求。非常感谢!