简体   繁体   English

具有古老的PairGrid图的ipywidgets

[英]ipywidgets with seaborn PairGrid plots

In a Jupyter Notebook I am visualizing the Iris dataset with seaborn in combination with ipywidgets. 在Jupyter笔记本中,我正在将Seaborn与ipywidgets结合使用来显示Iris数据集。 That works fine, except that is not that fast because the plots have to be rendered every time you select a new combination of the species 'versicolor', 'virginica' and 'setosa'. 效果很好,只是速度不是很快,因为每次您选择“ versicolor”,“ virginica”和“ setosa”物种的新组合时都必须绘制图。 See first code block. 请参阅第一个代码块。

So I tried to speed up the interaction by pre-processing the plots for each combination of species and storing them in a dictionary. 因此,我试图通过预处理每种物种组合的图并将它们存储在字典中来加快交互速度。 See second code block. 请参阅第二个代码块。 The dictionary seems to contain all plots, but they don't show. 该词典似乎包含所有情节,但未显示。

Any suggestions how to fix this? 任何建议如何解决此问题?

First code block: 第一个代码块:

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

Second code block: 第二个代码块:

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

Based on the answer to this question , this is the solution for optimizing the performance of the interaction. 基于此问题的答案,这是优化交互性能的解决方案。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM