В Jupyter Notebook я визуализирую набор данных Iris с морским дном в сочетании с ipywidgets. Это прекрасно работает, за исключением того, что это не так быстро, потому что сюжеты должны отображаться каждый раз, когда вы выбираете новую комбинацию вида "versicolor", "virginica" и "setosa". См. Первый блок кода.
Поэтому я попытался ускорить взаимодействие, предварительно обработав графики для каждой комбинации видов и сохранив их в словаре. См. Второй блок кода. Словарь, кажется, содержит все графики, но они не отображаются.
Любые предложения, как это исправить?
Первый кодовый блок:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from ipywidgets import *
sns.set(style="white")
iris = sns.load_dataset("iris")
def iris_pg(species):
g = sns.PairGrid(iris[iris.species.isin(species)], diag_sharey=False)
g.map_lower(sns.kdeplot)
g.map_upper(sns.scatterplot)
g.map_diag(sns.kdeplot, lw=3)
return plt.show()
interact(iris_pg,
species = widgets.SelectMultiple(options=iris.species.unique(),
value=tuple(iris.species.unique()[-2:]),
rows=len(iris.species.unique()),
description='species',
disabled=False))
Второй кодовый блок:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from ipywidgets import *
from itertools import combinations
sns.set(style="white")
iris = sns.load_dataset("iris")
all_combinations = list()
for i in range(1, len(iris.species.unique()) + 1):
for combi in combinations(iris.species.unique(), i):
all_combinations.append(combi)
all_plots = dict()
for i in all_combinations:
all_plots[i] = sns.PairGrid(iris[iris.species.isin(i)], diag_sharey=False)
all_plots[i].map_lower(sns.kdeplot)
all_plots[i].map_upper(sns.scatterplot)
all_plots[i].map_diag(sns.kdeplot, lw=3)
def iris_pg(species):
all_plots[species]
return plt.show()
options = iris.species.unique()
value = tuple(iris.species.unique()[-2:])
rows = len(iris.species.unique())
interact(iris_pg,
species = widgets.SelectMultiple(options=options,
value=value,
rows=rows,
description='species',
disabled=False))
Основываясь на ответе на этот вопрос, это решение для оптимизации производительности взаимодействия.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from ipywidgets import *
from itertools import combinations
sns.set(style="white")
iris = sns.load_dataset("iris")
all_combinations = list()
for i in range(1, len(iris.species.unique()) + 1):
for combi in combinations(iris.species.unique(), i):
all_combinations.append(combi)
all_plots = dict()
for i in all_combinations:
all_plots[i] = sns.PairGrid(iris[iris.species.isin(i)], diag_sharey=False)
all_plots[i].map_lower(sns.kdeplot)
all_plots[i].map_upper(sns.scatterplot)
all_plots[i].map_diag(sns.kdeplot, lw=3)
plt.close() # <-- added
def iris_pairgrid(species):
return all_plots[species].fig # <-- added .fig
o = iris.species.unique()
v = tuple(iris.species.unique()[-2:])
r = len(iris.species.unique())
interact(iris_pairgrid,
species = widgets.SelectMultiple(options=o,
value=v,
rows=r,
description='species',
disabled=False))
PairGrid
необходимо создавать новые фигуры, поэтому единственным вариантом будет затем скопировать фигуру с помощью чистого matplotlib и заполнить ее kdeplots / scatterplots на лету. Это также потребует использования интерактивного бэкэнда, такого как%matplotlib notebook
.