Морской котловина в сочетании с PairGrid - PullRequest
3 голосов
/ 26 января 2020

Я играю с набором данных Titani c и пытаюсь создать парный график численных переменных c для категориальных переменных. Я могу использовать Seaborn's catplot для построения графика зависимости одной числовой переменной c от одной категориальной переменной:

import seaborn as sns

sns.catplot(data=train, x='Fare', y='Sex')

Однако, если я попытаюсь использовать PairGrid для построения числовых переменных c относительно категориальных переменных :

x_vars = ['Fare']
y_vars = ['Sex']

g = sns.PairGrid(train, x_vars=x_vars, y_vars=y_vars)
g.map(sns.catplot)

Сбой с ошибкой:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-75-c284a7cfd727> in <module>
      9 #g.map_diag(lambda x, **kwargs: sns.catplot(x, x, **kwargs), jitter=True, kind="bar")
     10 #g.map(sns.scatterplot, y_jitter=1)#, hue=train["Survived"])
---> 11 g.map(sns.catplot)#, hue=train["Survived"])

~/MLProject/book1/lib/python3.8/site-packages/seaborn/axisgrid.py in map(self, func, **kwargs)
   1363         row_indices, col_indices = np.indices(self.axes.shape)
   1364         indices = zip(row_indices.flat, col_indices.flat)
-> 1365         self._map_bivariate(func, indices, **kwargs)
   1366         return self
   1367 

~/MLProject/book1/lib/python3.8/site-packages/seaborn/axisgrid.py in _map_bivariate(self, func, indices, **kwargs)
   1504             y_var = self.y_vars[i]
   1505             ax = self.axes[i, j]
-> 1506             self._plot_bivariate(x_var, y_var, ax, func, kw_color, **kws)
   1507         self._add_axis_labels()
   1508 

~/MLProject/book1/lib/python3.8/site-packages/seaborn/axisgrid.py in _plot_bivariate(self, x_var, y_var, ax, func, kw_color, **kwargs)
   1534             color = self.palette[k] if kw_color is None else kw_color
   1535 
-> 1536             func(x, y, label=label_k, color=color, **kwargs)
   1537 
   1538         self._clean_axis(ax)

~/MLProject/book1/lib/python3.8/site-packages/seaborn/categorical.py in catplot(x, y, hue, data, row, col, col_wrap, estimator, ci, n_boot, units, seed, order, hue_order, row_order, col_order, kind, height, aspect, orient, color, palette, legend, legend_out, sharex, sharey, margin_titles, facet_kws, **kwargs)
   3760 
   3761     # Initialize the facets
-> 3762     g = FacetGrid(**facet_kws)
   3763 
   3764     # Draw the plot onto the facets

~/MLProject/book1/lib/python3.8/site-packages/seaborn/axisgrid.py in __init__(self, data, row, col, hue, col_wrap, sharex, sharey, height, aspect, palette, row_order, col_order, hue_order, hue_kws, dropna, legend_out, despine, margin_titles, xlim, ylim, subplot_kws, gridspec_kws, size)
    268         # Make a boolean mask that is True anywhere there is an NA
    269         # value in one of the faceting variables, but only if dropna is True
--> 270         none_na = np.zeros(len(data), np.bool)
    271         if dropna:
    272             row_na = none_na if row is None else data[row].isnull()

TypeError: object of type 'NoneType' has no len()

Если я заменим g.map(sns.catplot) на g.map(sns.scatterplot), он успешно выполнит график без ошибок.

Как можно Я объединяю catplot с PairGrid?

1 Ответ

3 голосов
/ 10 апреля 2020

@ ImportanceOfBeingErnest уже дал правильный ответ в комментарии выше: нет смысла объединять sns.catplot() с отдельно созданным FacetGrid, потому что sns.catplot() создает свой собственный FacetGrid при вызове.

В любом случае sns.catplot() вызывает другую функцию seaborn для выполнения фактического изображения в каждой ячейке сетки. Эту функцию можно выбрать, указав аргумент ключевого слова kind в sns.catplot(). По умолчанию kind="strip".

Таким образом, если вы хотите вручную создать FacetGrid, а затем сопоставить sns.catplot() с ним, но без указания kind, вы также можете использовать sns.stripplot() вместо этого. Это работает, но набор данных Titani c слишком большой для стрипплотов, чтобы быть очень информативным, поэтому я бы вместо этого использовал графики для скрипки:

import seaborn as sns
sns.set()

titanic = sns.load_dataset('titanic')

num_vars = ['age', 'fare']
cat_vars = ['pclass', 'embarked', 'sex']

g = sns.PairGrid(data=titanic, x_vars=cat_vars, y_vars=num_vars)
g.map(sns.violinplot)

facet violin plots

sns.catplot () документация

...