Issue
I made a figure with four subplots of a histogram based on random normal, gamma, exponential, and uniform distributions respectively. I made it using matplotlib and Jupyter notebook. It is an interactive figure via ipywidgets lib. In particular, there are four slide bars that control the sample size on each histogram and update them accordingly. However, when updating the histograms, it annoyingly flickers. Is there any way to avoid this? Thx.
Now the code to be run on a jupyter notebook:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib notebook
from ipywidgets import *
n = 1000
x1 = np.random.normal(-2.5, 1, n)
x2 = np.random.gamma(2, 1.5, n)
x3 = np.random.exponential(2, n)+7
x4 = np.random.uniform(14,20, n)
x = [x1, x2, x3, x4]
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(10,7))
axs = [ax1,ax2,ax3,ax4]
titles = ['x1\nNormal', 'x2\nGamma', 'x3\nExponential', 'x4\nUniform']
subplots_axes = [[-7,2,0,250], [0,4.5,0,250], [7,25,0,250], [14,20,0,250]]
bins = [np.arange(-6, 6, 0.5),
np.arange(0, 10, 0.5),
np.arange(7, 17, 0.5),
np.arange(14, 24, 0.5)]
fig.subplots_adjust(hspace=0.5)
def plt_dist(s, sample):
axs[s].hist(x[s][:sample], bins=bins[s], linewidth=0, color='#1F77B4')
axs[s].axis(subplots_axes[s])
axs[s].set_title('{}'.format(titles[s]))
axs[s].set_ylabel('Frequency')
axs[s].set_xlabel('Value')
axs[s].annotate('n = {}'.format(sample), xycoords='axes fraction', xy = [0.8,0.9])
display(fig)
for s in range(0,4):
sld_bar = interact(plt_dist, s = fixed(s), sample = widgets.IntSlider(min=100,max=1000+45,step=1,value=100))
Solution
It's not really clear what display(fig)
would do or what it's needed for.
For me, removing that line and instead clearing the axes (axs[s].clear()
) at the beginning of the plt_hist
function works just fine and the "flickering" is not there anymore.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib notebook
from ipywidgets import *
n = 1000
x1 = np.random.normal(-2.5, 1, n)
x2 = np.random.gamma(2, 1.5, n)
x3 = np.random.exponential(2, n)+7
x4 = np.random.uniform(14,20, n)
x = [x1, x2, x3, x4]
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(10,7))
axs = [ax1,ax2,ax3,ax4]
titles = ['x1\nNormal', 'x2\nGamma', 'x3\nExponential', 'x4\nUniform']
subplots_axes = [[-7,2,0,250], [0,4.5,0,250], [7,25,0,250], [14,20,0,250]]
bins = [np.arange(-6, 6, 0.5),
np.arange(0, 10, 0.5),
np.arange(7, 17, 0.5),
np.arange(14, 24, 0.5)]
fig.subplots_adjust(hspace=0.5)
def plt_dist(s, sample):
axs[s].clear() # <-- clear axes
axs[s].hist(x[s][:sample], bins=bins[s], linewidth=0, color='#1F77B4')
axs[s].axis(subplots_axes[s])
axs[s].set_title('{}'.format(titles[s]))
axs[s].set_ylabel('Frequency')
axs[s].set_xlabel('Value')
axs[s].annotate('n = {}'.format(sample), xycoords='axes fraction', xy = [0.8,0.9])
#display(fig) <--- delete this
for s in range(0,4):
sld_bar = interact(plt_dist, s = fixed(s),
sample = widgets.IntSlider(min=100,max=1000+45,step=1,value=100))
Answered By - ImportanceOfBeingErnest
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.