我正在一个数组中绘制大约 10,000 个项目。它们具有大约 1,000 个独特值。
剧情已经进行了半个小时了。我确保其余代码有效。
有那么慢吗?这是我第一次用 pyplot 绘制直方图。
要使用 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)
在代码中的某个位置导入 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.hist()
缓慢的问题,请注意,这可能是由于处理非数字数据造成的。 使用value_counts()
轻松解决问题:
df['colour'].value_counts().plot(kind='bar')
我使用 Pandas
.hist()
方法也面临同样的问题。对我来说,解决方案是:
pd.to_numeric(df['your_data']).hist()
立即见效。
对我来说,在调用 hist 后需要调用
figure.canvas.draw()
才能立即更新,即 hist 实际上很快(在计时后发现),但在更新图形之前有几秒钟的延迟。我在 jupyter 实验室单元(qt5 后端)的 matplotlib 回调中调用 hist。
任何人遇到我遇到的问题 - (这完全是我的错:))
如果您正在处理数字,请确保从 CSV 读取时您的数据类型是 int/float,而不是字符串。
values_arr = .... .flatten().astype('float')
如果您正在使用 pandas,请确保您在 plt.hist() 中传递的数据是一维系列而不是数据帧。这帮助了我。
对于我来说,在我的例子中的 histplot 调用(sns)之前放置以下代码片段是有效的:
import matplotlib
import matplotlib.pyplot as plt
matplotlib.use('Qt5Agg')