การพล็อตข้อมูลเชิงหมวดหมู่ด้วยแพนด้าและ matplotlib


94

ฉันมีกรอบข้อมูลที่มีข้อมูลหมวดหมู่:

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

ฉันต้องการสร้างกราฟบางอย่างเช่นแผนภูมิวงกลมและฮิสโตแกรมตามหมวดหมู่ เป็นไปได้หรือไม่โดยไม่ต้องสร้างตัวแปรตัวเลขจำลอง สิ่งที่ต้องการ

df.plot(kind='hist')

คำตอบ:


181

คุณสามารถใช้value_countsกับซีรีส์:

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

ป้อนคำอธิบายภาพที่นี่


1
แนะนำdf["colour"].value_counts().plot(kind='bar')เป็นทางเลือกทั่วไป
openwonk

2
สามารถระบุลำดับของป้ายกำกับ x ได้หรือไม่?
P. Camilleri

3
ได้คุณสามารถระบุลำดับของป้ายกำกับ x อย่างชัดเจนได้เช่นdf['colour'].value_counts()[['green', 'yellow', 'blue', 'red']]
Alexander

คุณช่วยบอกฉันได้ไหมว่าฉันจะปรับเปลี่ยนพล็อตนี้ได้อย่างไร ฉันหมายถึงว่าฉันต้องการเปลี่ยนสีสำหรับทุกชั้นเรียนหรือฉันต้องการเพิ่มตำนานลงไป
Ibtihaj Tahir

24

คุณอาจพบmosaicพล็อตที่เป็นประโยชน์จาก statsmodels ซึ่งสามารถให้การเน้นทางสถิติสำหรับความแปรปรวน

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

ป้อนคำอธิบายภาพที่นี่

แต่ระวังเซลล์ขนาด 0 เพราะจะทำให้เกิดปัญหากับป้ายกำกับ

ดูรายละเอียดคำตอบนี้


ขอบคุณ. ฉันได้รับ ValueError เรื่อย ๆ : ไม่สามารถแปลง NA เป็นจำนวนเต็มได้
Ivan

1
นั่นเป็นเหตุผลที่ฉันอ้างถึงคำตอบนี้ ควรช่วยแก้ไขปัญหานี้
Primer


11

คุณยังสามารถใช้countplotจากseaborn. แพคเกจนี้สร้างขึ้นpandasเพื่อสร้างอินเทอร์เฟซการลงจุดระดับสูง ให้สไตล์ที่ดีและป้ายแกนที่ถูกต้องฟรี

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

ป้อนคำอธิบายภาพที่นี่

นอกจากนี้ยังสนับสนุนการระบายสีแถบด้วยสีที่เหมาะสมด้วยเคล็ดลับเล็กน้อย

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

ป้อนคำอธิบายภาพที่นี่


10

ในการพล็อตคุณลักษณะเชิงหมวดหมู่หลายรายการเป็นแผนภูมิแท่งในพล็อตเดียวกันฉันขอแนะนำ:

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

ป้อนคำอธิบายภาพที่นี่


1
นี่คือเอฟเฟกต์ Stroop ที่ยอดเยี่ยม!
Ciprian Tomoiagă
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.