Интерактивное обновление фигуры морского волка с помощью ipywidgets в классе - PullRequest
0 голосов
/ 29 марта 2019

При объединении seaborn и ipywidgets с классом интерактивное обновление рисунка не работает должным образом. Я хочу, чтобы раскрывающийся список фильтровал фрейм данных и обновлял рисунок тепловой карты.

Если я использую приведенный ниже код с 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 для sns.heatmap не используется: https://i.imgur.com/tk9Kl3F.png

...