Merencanakan data kategorikal dengan panda dan matplotlib

94

Saya memiliki bingkai data dengan data kategorikal:

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

Saya ingin membuat beberapa grafik, seperti diagram lingkaran dan histogram berdasarkan kategori. Apakah mungkin tanpa membuat variabel numerik tiruan? Sesuatu seperti

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

Jawaban:

181

Anda cukup menggunakan value_countsdi seri:

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

masukkan deskripsi gambar di sini

Alexander
sumber
1
Menyarankan df["colour"].value_counts().plot(kind='bar')sebagai alternatif umum
openwonk
2
Apakah mungkin untuk menentukan urutan label x?
P. Camilleri
3
Ya, Anda dapat menentukan urutan x-label secara eksplisit, misalnyadf['colour'].value_counts()[['green', 'yellow', 'blue', 'red']]
Alexander
Bisakah Anda memberi tahu saya bagaimana saya bisa membuat penyesuaian pada plot ini. Maksud saya seperti jika saya ingin mengubah warna untuk setiap kelas atau saya ingin menambahkan legenda padanya.
Ibtihaj Tahir
24

Anda mungkin menemukan mosaicplot yang berguna dari statsmodels. Yang juga dapat memberikan sorotan statistik untuk varians.

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

masukkan deskripsi gambar di sini

Tetapi berhati-hatilah dengan sel berukuran 0 - mereka akan menyebabkan masalah dengan label.

Lihat jawaban ini untuk detailnya

Primer
sumber
Terima kasih. Saya terus mendapatkan ValueError: Tidak dapat mengubah NA menjadi integer di atasnya.
Ivan
1
Itulah mengapa saya mereferensikan jawaban ini . Ini akan membantu untuk mengatasi masalah ini.
Primer
19

seperti ini :

df.groupby('colour').size().plot(kind='bar')
steboc.dll
sumber
11

Anda juga bisa menggunakan countplotdari seaborn. Paket ini dibuat pandasuntuk membuat antarmuka plot tingkat tinggi. Ini memberi Anda gaya yang baik dan label sumbu yang benar secara gratis.

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')

masukkan deskripsi gambar di sini

Ini juga mendukung pewarnaan batang dengan warna yang tepat dengan sedikit trik

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

masukkan deskripsi gambar di sini

Jarno
sumber
10

Untuk memplot beberapa fitur kategorikal sebagai diagram batang pada plot yang sama, saya sarankan:

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()

masukkan deskripsi gambar di sini

Roman Orac
sumber
1
Ini adalah efek Stroop yang bagus!
Ciprian Tomoiagă