将seaborn和ipywidget与一个类结合使用时,以交互方式更新图形无法正常工作。我希望下拉列表过滤数据框并更新热图。
如果我将下面的代码与ax=self.ax
内的sns.heatmap
一起使用,则该图根本不会更新。当我删除此参数时,将创建一个新图形,而不是更新原始图形(请参见底部图形)。
我不想使用IPython.display.clear_output
,因为这也会删除小部件。
import numpy as np
import pandas as pd
import seaborn as sns
from ipywidgets import Dropdown, VBox
from IPython.display import display
import matplotlib.pyplot as plt
class InteractiveHeatmap(object):
def __init__(self):
df1 = pd.DataFrame(np.random.randint(0,100,size=(4, 3)),
columns=['a', 'b', 'c'])
df1['set'] = 'set1'
df2 = pd.DataFrame(np.random.randint(0,100,size=(4, 3)),
columns=['a', 'b', 'c'])
df2['set'] = 'set2'
self.df = pd.concat([df1, df2], ignore_index=True)
self.fig, self.ax = plt.subplots(figsize=(10,5), dpi=72)
self.ui()
self.draw(filt='set1')
def callback(self, change):
self.draw(change['new'])
def ui(self):
w = Dropdown(options=self.df['set'].drop_duplicates(),
value=self.df['set'][0])
w.observe(self.callback, names='value')
display(w)
def draw(self, filt):
df = self.df[self.df['set']==filt]
pivot = df.pivot_table(index='a', columns='b', values='c')
sns.heatmap(pivot, mask=pivot.isnull(), ax=self.ax)
plt.show()
ih = InteractiveHeatmap()
未使用ax=self.ax
的{{1}}时:https://i.imgur.com/tk9Kl3F.png