在课堂上使用ipywidget交互式更新seaborn人物

时间:2019-03-29 17:25:53

标签: matplotlib jupyter-notebook seaborn ipywidgets

将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

0 个答案:

没有答案