Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python Matplotlib: กำหนดลำดับแท่งใน Bar Chart

บทนำ

ลำดับแท่งใน bar chart ตามลำดับข้อมูลใน DataFrame ค่าเริ่มต้น ใช้ sort_values() จัดเรียง DataFrame ก่อนพลอท เพื่อควบคุมลำดับแท่ง

ตัวอย่างโค้ด


import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True

# ข้อมูลต้นทาง (ไม่เรียง)
df = pd.DataFrame({
    'names': ['John', 'James', 'David', 'Gary', 'Watson'],
    'marks': [23, 34, 30, 19, 20]
})

print("DataFrame ต้นทาง:")
print(df)

# Subplot 1: ลำดับต้นทาง
plt.subplot(1, 2, 1)
plt.bar('names', 'marks', data=df, color='green')
plt.title("Original Order")

# Subplot 2: เรียงตาม marks
df_sorted = df.sort_values('marks')
plt.subplot(1, 2, 2)
plt.bar('names', 'marks', data=df_sorted, color='blue')
plt.title("Sorted by Marks")

plt.show()

ผลลัพธ์

กราญซ้าย: John(23), James(34), David(30), Gary(19), Watson(20) - ตามลำดับ DataFrame
กราญขวา: Gary(19), Watson(20), John(23), David(30), James(34) - เรียงน้อยไปมาก

วิธีควบคุมลำดับอื่นๆ

1. Categorical ด้วย ordered categories


# กำหนดลำดับเฉพาะ
custom_order = ['Gary', 'Watson', 'John', 'David', 'James']
df['names'] = pd.Categorical(df['names'], categories=custom_order, ordered=True)
df = df.sort_values('names')
plt.bar('names', 'marks', data=df)

2. ใช้ order parameter ใน seaborn


import seaborn as sns
sns.barplot(x='names', y='marks', data=df, order=custom_order)

3. เรียงตามคอลัมน์อื่น (multi-column sort)


df_sorted = df.sort_values(['marks', 'names'], ascending=[False, True])
# เรียง marks มาก→น้อย, ถ้าเท่ากัน เรียงชื่อ A-Z

4. Horizontal Bar Chart (barh)


plt.barh('names', 'marks', data=df_sorted, color='blue')
plt.title("Horizontal Bar Chart (Sorted)")
# แท่งแนวนอน อ่านชื่อง่ายกว่า

การปรับแต่ง Bar Chart


plt.bar(
    'names', 'marks', data=df_sorted,
    color='steelblue',
    edgecolor='black',
    linewidth=1.2,
    width=0.6,              # ความกว้างแท่ง
    align='center',         # จัดกลาง tick
    alpha=0.8
)

# เพิ่มค่าบนแท่ง
for i, v in enumerate(df_sorted['marks']):
    plt.text(i, v + 0.5, str(v), ha='center', fontweight='bold')

plt.xlabel('Name')
plt.ylabel('Marks')
plt.title('Marks by Student (Sorted)')
plt.tight_layout()

สรุป

ลำดับแท่ง = ลำดับแถวใน DataFrame ใช้ df.sort_values('column') จัดเรียงก่อนพลอท สำหรับลำดับกำหนดเอง ใช้ pd.Categorical หรือ seaborn order= parameter