При объединении 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