I'm plotting about 10,000 items in an array. They are of around 1,000 unique values.
The plotting has been running half an hour now. I made sure rest of the code works.
Is it that slow? This is my first time plotting histograms with pyplot.
I'm plotting about 10,000 items in an array. They are of around 1,000 unique values.
The plotting has been running half an hour now. I made sure rest of the code works.
Is it that slow? This is my first time plotting histograms with pyplot.
To plot histograms using matplotlib quickly you need to pass the histtype='step' argument to pyplot.hist. For example:
plt.hist(np.random.exponential(size=1000000,bins=10000))
plt.show()
takes ~15 seconds to draw and roughly 5-10 seconds to update when you pan or zoom.
In contrast, plotting with histtype='step':
plt.hist(np.random.exponential(size=1000000),bins=10000,histtype='step')
plt.show()
plots almost immediately and can be panned and zoomed with no delay.
It will be instant to plot the histogram after flattening the numpy array. Try the below demo code:
import numpy as np
array2d = np.random.random_sample((512,512))*100
plt.hist(array2d.flatten())
plt.hist(array2d.flatten(), bins=1000)
array2d.flatten() does cause the histograms to be plotted as one. Resolution is to add each column separately.numpy.histogram underneath hist, which already calculates the histogram with the array flattened.Importing seaborn somewhere in the code may cause pyplot.hist to take a really long time.
If the problem is seaborn, it can be solved by resetting the matplotlib settings:
import seaborn as sns
sns.reset_orig()
For me, the problem is that the data type of pd.Series, say S, is 'object' rather than 'float64'. After I use S = np.float64(S), then plt.hist(S) is very quick.
pandas.Series is with .astype(): S.astype('float64')Since several answers already mention the issue of slowness with pandas.hist(), note that it may be due to dealing with non-numerical data. An issue easily solved by using value_counts() :
df['colour'].value_counts().plot(kind='bar')
For me it took calling figure.canvas.draw() after the call to hist to update immediately, i.e. hist was actually fast (discovered that after timing it), but there was a delay of a few seconds before figure was updated. I was calling hist inside a matplotlib callback in a jupyter lab cell (qt5 backend).