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

Jawaban:


181

Anda cukup menggunakan value_countsdi seri:

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

masukkan deskripsi gambar di sini


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


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


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


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


1
Ini adalah efek Stroop yang bagus!
Ciprian Tomoiagă
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.