在Jupyter Notebook中,我正在使用ipywidgets与seaborn相结合来可视化鸢尾花数据集。这很好用,但是由于每次选择新的物种'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))
PairGrid
需要创建新的图形,所以唯一的选择就是用纯 matplotlib 复制该图形,并在运行时用 kdeplots/scatterplots 填充它。这还需要使用交互后端,比如%matplotlib notebook
。 - ImportanceOfBeingErnest