我正在绘制一个包含大约1,000个唯一值的数组中的10,000项。绘图已运行了半小时。我确保了代码的其余部分工作正常。
这很慢吗?这是我第一次使用pyplot绘制直方图。
我正在绘制一个包含大约1,000个唯一值的数组中的10,000项。绘图已运行了半小时。我确保了代码的其余部分工作正常。
这很慢吗?这是我第一次使用pyplot绘制直方图。
为了快速使用matplotlib绘制直方图,您需要在pyplot.hist
中传递histtype='step'
参数。例如:
要使用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()
绘图几乎立即完成,并且可以无延迟地平移和缩放。
将numpy数组展平后,制作直方图会非常快。请尝试下面的示例代码:
import numpy as np
array2d = np.random.random_sample((512,512))*100
plt.hist(array2d.flatten())
plt.hist(array2d.flatten(), bins=1000)
array2d.flatten()
会导致直方图绘制成一个整体。解决方法是分别添加每一列。 - Eilon Baer在代码中引入seaborn可能会导致pyplot.hist执行时间非常长。
如果问题是由seaborn引起的,可以通过重置matplotlib设置来解决:
import seaborn as sns
sns.reset_orig()
对于我来说,问题在于pd.Series
的数据类型(比如S)是'object'
而不是'float64'
。我使用S = np.float64(S)
之后,plt.hist(S)
就非常快了。
pandas.Series
类型的正确方法是使用.astype()
函数: S.astype('float64')
。 - Trenton McKinney由于多个答案已经提到了使用 pandas.hist()
时速度慢的问题,需要注意的是这可能是由于处理非数值数据所导致的。这个问题可以通过使用 value_counts()
很容易地解决:
df['colour'].value_counts().plot(kind='bar')
我在使用Pandas的.hist()
方法时遇到了同样的问题。对我来说解决方案是:
pd.to_numeric(df['your_data']).hist()
立即生效。
figure.canvas.draw()
才能立即更新,也就是说,hist实际上很快(在计时后发现),但在图形更新前会有几秒钟的延迟。我是在jupyter lab单元格(qt5后端)中的matplotlib回调函数内调用hist的。有没有人遇到我遇到的问题 - (完全是我的错 :) )
如果你正在处理数字,请确保在从CSV读取时,数据类型是int / float,而不是string。
values_arr = .... .flatten().astype('float')