如何使用matplotlib创建一个非常大的数据集的条形图?

e0bqpujr  于 2022-11-15  发布在  其他
关注(0)|答案(2)|浏览(122)

我正在处理的数据是一个27,000个元素长的数组,它是一个几百万个数据点的直方图,但我所拥有的是直方图,我需要在我的程序中绘制它,最好是用竖线。
我试过在matplotlib中使用'bar'函数,但这需要一两分钟的时间来绘制,而使用普通的图(只有图表上的点)几乎是立即的,但显然没有达到我想要的效果(即,条)。我不知道为什么条函数这么慢,所以我想知道是否有一个更有效的方法来绘制直方图与垂直条使用matplotlib?
我看过matplotlib的hist函数,但据我所知,它的目的是获取数据,制作直方图,然后绘制它,但我已经有一个直方图,所以我不相信它适用于我的情况。我非常感谢任何帮助!
这里有一个hist函数文档的参考,可能我遗漏了一些东西。https://matplotlib.org/3.2.0/api/_as_gen/matplotlib.pyplot.hist.html
提前感谢!如果你想知道我正在使用的代码的例子,让我知道,但它只是你最通用的my_axes.plot(my_data)my_axes.bar(my_data),所以我不知道它会有多大的帮助。
我现在也看了一下这个:是的。
这也能工作,但是和使用竖线有同样的时间问题,所以我想这只是渲染大量竖线的问题吧?(尽管我仍然想知道为什么渲染27000点会发生得这么快)

0yg35tkg

0yg35tkg1#

显然,这是条形图的一个已知和讨论过的局限性,因为它是目前实现的。请参见这个issue和这个discussion。虽然关于它的有用性还有一些问题,但在我的特定情况下,我在顶部有一个工具栏,允许用户放大和移动数据集(这是我的用例非常实用的方法)。
然而,一个很好的替代方案确实存在于楼梯的形式。简单地使用填充,你就有了一个有效的条形图,这是更好的表现。

import matplotlib.pyplot as plt
import random

bins = range(27001)  # Note that bins needs to be one greater then heights
heights = [random.randint(0, i) for i in range(27000)]

ax = plt.gca()
ax.stairs(heights, bins, fill=True)

plt.show()
jfgube3f

jfgube3f2#

matplotlib的bar执行起来应该很快,所以我猜你会把所有的数据点传递给它(虽然你提到你有“直方图数据”,所以如果你能提供更多关于格式的细节,那会很有帮助)。
bar获取条形图的x位置和高度,因此如果希望bar函数生成直方图,则需要进行bin和计数。
这将产生类似于matplotlib的hist的结果:

import matplotlib.pyplot as plt

bins = [0, 1, 2, 3]
heights = [1, 2, 3, 4]

ax = plt.gca()
ax.bar(bins, heights, align='center', width=1)

相关问题