Как построить категориальные данные с помощью seaborn, задав стиль печати для каждого столбца данных? - PullRequest
4 голосов
/ 19 февраля 2020

Фон

Допустим, у меня есть следующий набор данных:

import pandas as pd
import numpy as np

data = ([["Cheese", x] for x in np.random.normal(0.8, 0.03, 10)] + 
        [["Meat", x] for x in np.random.normal(0.4, 0.05, 14)] + 
        [["Bread", 0.8], ["Bread", 0.65]])

df = pd.DataFrame(data, columns=["Food", "Score"])


import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="ticks", color_codes=True)
sns.set_context("paper")
sns.catplot(x="Score", y="Food", kind="box", data=df)

, который дает следующий график (или аналогичный, в зависимости от сгенерированных случайных чисел):

Sample box plot

Причина, по которой я собираюсь получить коробочные графики с моими фактическими данными, заключается в том, что отдельные точки в сочетании с количеством категорий, которые я хочу показать, делают график визуально слишком шумным и коробки дают хороший общий обзор того, как распределяются данные, и это то, что мне нужно. Однако проблема заключается в таких категориях, как категория «Хлеб».

Вопрос

Как вы можете заметить, морские раки производили коробки со срединными, квартилями и т. Д. c. для всех трех категорий. Однако, поскольку категория «Хлеб» имеет только две точки данных, использование блочного графика для этой категории на самом деле не является подходящим представлением. Я бы предпочел эту категорию только в виде отдельных точек.

Но, если посмотреть на примеры на https://seaborn.pydata.org/tutorial/categorical.html, единственное предложение по объединению коробчатых графиков и простые точки - это построить оба для всех категорий, что не является тем, что мне нужно.

Вкратце: Как я могу отобразить категориальные данные с seaborn, выбрав соответствующее представление для каждой категории?

1 Ответ

0 голосов
/ 19 февраля 2020

Возможно, попробуйте создать df для хлеба, а не для хлеба:

dfb = df[df['Food'].notnull() & (df['Food'] == 'Bread')]
dfnot_b = df[df['Food'].notnull() & (df['Food'] != 'Bread')]

, затем добавьте еще одну ось:

fig, ax = plt.subplots()
ax2 = ax.twinx()

, попробуйте разные графики:

sns.boxplot(x="Score", y="Food", data=dfnot_b, ax=ax)
sns.stripplot(x="Score", y="Food", data=dfb, ax=ax2)

plot overlay

...