Traçando dados categóricos com pandas e matplotlib

95

Tenho um quadro de dados com dados categóricos:

     colour  direction
1    red     up
2    blue    up
3    green   down
4    red     left
5    red     right
6    yellow  down
7    blue    down

Quero gerar alguns gráficos, como gráficos de pizza e histogramas com base nas categorias. É possível sem criar variáveis ​​numéricas fictícias? Algo como

df.plot(kind='hist')
Ivan
fonte

Respostas:

182

Você pode simplesmente usar value_countsna série:

df['colour'].value_counts().plot(kind='bar')

insira a descrição da imagem aqui

Alexandre
fonte
1
Sugerindo df["colour"].value_counts().plot(kind='bar')como alternativa comum
openwonk
2
É possível especificar a ordem dos rótulos x?
P. Camilleri
3
Sim, você pode especificar a ordem dos rótulos x explicitamente, por exemplodf['colour'].value_counts()[['green', 'yellow', 'blue', 'red']]
Alexander
Você pode me dizer como posso fazer ajustes neste gráfico. Quero dizer, se eu quiser mudar a cor de cada aula ou adicionar uma legenda a ela.
Ibtihaj Tahir
24

Você pode encontrar um mosaicgráfico útil em modelos de estatísticas. O que também pode dar destaque estatístico para as variações.

from statsmodels.graphics.mosaicplot import mosaic
plt.rcParams['font.size'] = 16.0
mosaic(df, ['direction', 'colour']);

insira a descrição da imagem aqui

Mas tome cuidado com a célula de tamanho 0 - ela causará problemas com os rótulos.

Veja esta resposta para detalhes

Primer
fonte
Obrigado. Continuo recebendo ValueError: não é possível converter NA para inteiro nele.
Ivan
1
É por isso que fiz referência a esta resposta . Deve ajudar a resolver este problema.
Primer
19

como isso :

df.groupby('colour').size().plot(kind='bar')
Steboc
fonte
12

Você também pode usar countplotde seaborn. Este pacote é desenvolvido pandaspara criar uma interface de plotagem de alto nível. Oferece um bom estilo e rótulos de eixo corretos gratuitamente.

import pandas as pd
import seaborn as sns
sns.set()

df = pd.DataFrame({'colour': ['red', 'blue', 'green', 'red', 'red', 'yellow', 'blue'],
                   'direction': ['up', 'up', 'down', 'left', 'right', 'down', 'down']})
sns.countplot(df['colour'], color='gray')

insira a descrição da imagem aqui

Ele também suporta colorir as barras na cor certa com um pequeno truque

sns.countplot(df['colour'],
              palette={color: color for color in df['colour'].unique()})

insira a descrição da imagem aqui

Jarno
fonte
Oi. Como posso modificar os nomes das variáveis, por exemplo, tenho quase 10 categorias de uma variável e quando faço este gráfico os nomes se sobrepõem. O que posso fazer para não fazer isso acontecer? Devo aumentar o tamanho do figo ou algo assim?
Mahreen Athar de
10

Para traçar vários recursos categóricos como gráficos de barras no mesmo gráfico, eu sugeriria:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(
    {
        "colour": ["red", "blue", "green", "red", "red", "yellow", "blue"],
        "direction": ["up", "up", "down", "left", "right", "down", "down"],
    }
)

categorical_features = ["colour", "direction"]
fig, ax = plt.subplots(1, len(categorical_features))
for i, categorical_feature in enumerate(df[categorical_features]):
    df[categorical_feature].value_counts().plot("bar", ax=ax[i]).set_title(categorical_feature)
fig.show()

insira a descrição da imagem aqui

Orac romano
fonte
1
Este é um ótimo efeito Stroop!
Ciprian Tomoiagă
0

Você pode simplesmente usar value_countscom a sortopção definida como False. Isso preservará a ordem das categorias

df['colour'].value_counts(sort=False).plot.bar(rot=0)

link para imagem

msenior_
fonte