seaborn countplot не показывает все категории - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь построить подкатегории в столбцах с накоплением, используя countplot. У меня проблема в том, что столбцы с накоплением не отображают все категории

import seaborn as sns
from matplotlib import pyplot
flatui = ["#9b59b6", "#3498db", "#95a5a6", "#e74c3c", "#34495e", "#2ecc71"]

fig, ax = pyplot.subplots(figsize=(20,15))
g = sns.countplot(ax=ax,
            y="LV1",
            hue="LV2",
            palette=sns.color_palette("hls", 8) + sns.color_palette("Paired") + sns.color_palette(flatui),
            dodge=False,
            data=plot_data);
g.legend(loc='center left', bbox_to_anchor=(1, 0.6), ncol=3)

Описание содержимого фрейма данных:

LV1 - это столбец, содержащий верхнюю категорию и LV2 является подкатегорией. В качестве примера здесь вы можете увидеть, что R имеет только две подкатегории, но это не тот случай, когда у него 21, в котором топ 1 имеет 20 вхождений, а топ 2 и 3 имеют 9 вхождений. enter image description here

1 Ответ

1 голос
/ 22 января 2020

Вероятные столбцы перекрывают друг друга, и один больший перекрывает все остальные меньшие, так как вы вызываете dodge=False. Если вы ограничите данные plot_data только категорией R с dodge=True, все категории должны присутствовать. Поскольку графические диаграммы не суммируются, рассмотрите гистограмму с накоплением вместо графовой диаграммы, которая более или менее синонимична гистограмме категориальной переменной.

Для демонстрации см. Следующий воспроизводимый пример:

Данные

import numpy as np
import pandas as pd

from  matplotlib import pyplot
import seaborn as sns

### DATA BUILD
data_tools = ['sas', 'stata', 'spss', 'python', 'r', 'julia']
np.random.seed(12220)
random_df = pd.DataFrame({'group': np.random.choice(data_tools, 500),
                          'int': np.random.randint(1, 10, 500)})

Первый график (посмотрите, как показывает только большая строка 'stata' в int = 6)

flatui = ["#9b59b6", "#3498db", "#95a5a6", "#e74c3c", "#34495e", "#2ecc71"]

fig, ax = pyplot.subplots(figsize=(8,4))

g = sns.countplot(ax=ax,
                  y="int",
                  hue="group",
                  palette=(sns.color_palette("hls", 8) + 
                           sns.color_palette("Paired") + 
                           sns.color_palette(flatui)),
                  dodge=False,
                  data=random_df)

g.legend(loc='upper center', ncol=3)

First Plot

Второй график (показывает другие категории, кроме самого большого бара в 'stata' для int = 6)

fig, ax = pyplot.subplots(figsize=(8,4))

g = sns.countplot(ax=ax,
                  y="int",
                  hue="group",
                  palette=(sns.color_palette("hls", 8) + 
                           sns.color_palette("Paired") + 
                           sns.color_palette(flatui)),
                  dodge=True,                              # CHANGING DODGE PARAM
                  data=random_df.query("int==6"))          # FILTERING DATA

g.legend(loc='upper center',ncol=3)

Second Plot

...