python - 带有 seaborn PairGrid 图的 ipywidgets

标签 python seaborn ipywidgets

在 Jupyter Notebook 中,我正在使用 seaborn 结合 ipywidgets 可视化 Iris 数据集。这很好用,只是速度不是那么快,因为每次选择“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))

最佳答案

基于对此 question 的回答,这是优化交互性能的解决方案。

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

关于python - 带有 seaborn PairGrid 图的 ipywidgets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51544577/

相关文章:

python - sympy 微分方程组 : Not Implemented

python - 如何绘制 seaborn ridge plot

python - 根据 ipywidgets 中另一个下拉列表的选择更新下拉列表

python - 带有 Ipywidgets 和交互式图形的 Pyqt5/Pyside 应用程序

python - 用户没有存储桶的 storage.objects.list 访问权限

python - 滚动应用函数必须是实数,而不是Nonetype

python - 使用 seaborn jointplot 更改每个点的颜色和标记

python - 如何更改 Seaborn.pairplot 中的散点透明度?

python - 如何使 ipywidgets 图像可点击?

php - 验证由 python passlib 生成的密码哈希