ipywidgets с участками Seaborn PairGrid

1

В 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))
  • 0
    Я предполагаю, что узким местом является не агрегация данных, а создание сюжета. Таким образом, даже если бы второе решение работало, оно, вероятно, не было бы значительно быстрее. К сожалению, PairGrid необходимо создавать новые фигуры, поэтому единственным вариантом будет затем скопировать фигуру с помощью чистого matplotlib и заполнить ее kdeplots / scatterplots на лету. Это также потребует использования интерактивного бэкэнда, такого как %matplotlib notebook .
  • 0
    Спасибо за ваш комментарий. Ответ ниже дает мне улучшение производительности, которое я искал.
Теги:
ipywidgets
seaborn

1 ответ

0

Основываясь на ответе на этот вопрос, это решение для оптимизации производительности взаимодействия.

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))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню