【问题标题】:ipywidgets with seaborn PairGrid plots带有 seaborn PairGrid 图的 ipywidgets
【发布时间】:2018-07-26 17:36:06
【问题描述】:

在 Jupyter Notebook 中,我使用 seaborn 和 ipywidgets 可视化 Iris 数据集。这很好用,只是速度不是那么快,因为每次选择物种“杂色”、“维吉尼卡”和“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
  • 感谢您的评论。下面的答案为我提供了我一直在寻找的性能改进。

标签: python seaborn ipywidgets


【解决方案1】:

根据这个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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多