【问题标题】:Matplotlib.pyplot.hist() very slowMatplotlib.pyplot.hist() 非常慢
【发布时间】:2016-06-14 18:33:43
【问题描述】:

我在一个数组中绘制了大约 10,000 个项目。它们具有大约 1,000 个唯一值。

绘图已经进行了半个小时。我确保其余代码都能正常工作。

有这么慢吗?这是我第一次用 pyplot 绘制直方图。

【问题讨论】:

  • 是的,我会说这很慢。实际上,这取决于您选择了多少个 bin,但即对于 1000 个 bin,我可以在一两秒内绘制 10 000 个随机生成的值。 Python 2,笔记本电脑内核 Intel i5 os Ubuntu 14.04。显示一些代码,它会让事情变得更容易。
  • 实际上我只是通过减少垃圾箱的数量来解决它。不过还是谢谢。
  • 您确定您使用的是正确的列数据类型吗?我使用的是字符串而不是整数,这对我来说是一个纯粹的错误。

标签: python matplotlib histogram


【解决方案1】:

对我来说,问题在于 pd.Series 的数据类型,比如 S,是 'object' 而不是 'float64'。我用S = np.float64(S)之后,那么plt.hist(S)就很快了。

【讨论】:

  • 更改pandas.Series类型的正确方法是使用.astype()S.astype('float64')
【解决方案2】:

由于几个答案已经提到了pandas.hist() 的缓慢问题,请注意这可能是由于处理非数字数据所致。一个使用value_counts()轻松解决的问题:

df['colour'].value_counts().plot(kind='bar')

credits

【讨论】:

    【解决方案3】:

    我在使用 Pandas .hist() 方法时遇到了同样的问题。对我来说,解决方案是:

    pd.to_numeric(df['your_data']).hist()
    

    立即生效。

    【讨论】:

      【解决方案4】:

      如果您使用的是 pandas,请确保您在 plt.hist() 中传递的数据是一维序列而不是数据框。这帮助了我。

      【讨论】:

        【解决方案5】:

        任何遇到我遇到的问题的人 - (这完全是我的错:))

        如果您处理的是数字,请确保在从 CSV 读取数据时,您的数据类型是 int/float,而不是 string。

        values_arr = .... .flatten().astype('float')
        

        【讨论】:

          【解决方案6】:

          对我来说,在调用 hist 之后调用 figure.canvas.draw() 会立即更新,即 hist 实际上很快(在计时之后发现),但是在更新图形之前有几秒钟的延迟。我在 jupyter 实验室单元(qt5 后端)的 matplotlib 回调中调用 hist。

          【讨论】:

            【解决方案7】:

            在展平 numpy 数组后立即绘制直方图。试试下面的演示代码:

            import numpy as np
            
            array2d = np.random.random_sample((512,512))*100
            plt.hist(array2d.flatten())
            plt.hist(array2d.flatten(), bins=1000)
            

            【讨论】:

            • 遇到了同样的问题,这个解决方案很有效。
            • 这应该是公认的答案。立即处理 100k 值,而不是不返回。如果绘制多个直方图,array2d.flatten() 确实会导致将直方图绘制为一个。解决方法是分别添加每一列。
            【解决方案8】:

            在代码中的某处导入seaborn 可能会导致pyplot.hist 需要很长时间。

            如果是seaborn问题,可以通过重置matplotlib设置来解决:

            import seaborn as sns
            sns.reset_orig()
            

            【讨论】:

              【解决方案9】:

              要使用 matplotlib 快速绘制直方图,您需要将 histtype='step' 参数传递给 pyplot.hist。例如:

              plt.hist(np.random.exponential(size=1000000,bins=10000))
              plt.show()
              

              当您平移或缩放时,绘制大约需要 15 秒,更新大约需要 5-10 秒。

              相比之下,用histtype='step'绘图:

              plt.hist(np.random.exponential(size=1000000),bins=10000,histtype='step')
              plt.show()
              

              几乎立即绘图,并且可以无延迟地平移和缩放。

              【讨论】:

              • 这比你说的快得多(我看到的时间和你一样)。但是使用 histt​​ype='step' 的图表看起来非常不同。
              • @dementedhedgehog 是的,他们有。我想这取决于你在哪个学科。在高能物理学中,步法是常态。前段时间我在 matplotlib 页面上打开了一个 issue 来讨论这个问题:github.com/matplotlib/matplotlib/issues/7121.
              猜你喜欢
              • 2015-05-22
              • 1970-01-01
              • 2017-12-12
              • 2015-06-14
              • 2013-05-14
              • 2021-05-24
              • 1970-01-01
              • 2013-06-24
              • 2013-12-13
              相关资源
              最近更新 更多