กราฟแท่งและฮิสโตแกรม
แสดงจำนวนข้อมูลแบบหมวดหมู่ด้วย ax.bar() และการกระจายของข้อมูลด้วย ax.hist() พร้อมปรับจำนวนช่วงและสีขอบ
กราฟแท่งและฮิสโตแกรม เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
แผนภูมิแท่งและฮิสโตแกรม
แผนภูมิแท่ง แสดงข้อมูลเชิงหมวดหมู่ โดยมีแท่งหนึ่งแท่งต่อหนึ่งหมวดหมู่ และความสูงของแท่งแปรผันตามค่า แผนภูมินี้ตอบคำถามว่า “แต่ละหมวดหมู่มีปริมาณเท่าใด” ฮิสโตแกรม แสดงการกระจายของตัวแปรตัวเลขแบบต่อเนื่อง โดยแบ่งข้อมูลเป็นช่วง และใช้ความสูงของแท่งแสดงจำนวนหรือความถี่ในแต่ละช่วง แผนภูมินี้ตอบคำถามว่า “ค่าเหล่านี้กระจายตัวอย่างไร” ทั้งสองแบบใช้ ax.bar() และ ax.hist() ตามลำดับ
ax.bar() สำหรับแผนภูมิแท่งแนวตั้ง
ax.bar(x, height) วาดแผนภูมิแท่งแนวตั้ง โดย x คือชุดตำแหน่งของหมวดหมู่ (หรือป้ายกำกับ) และ height คือค่าของแท่ง พารามิเตอร์สำคัญ ได้แก่ width (ค่าเริ่มต้น 0.8 ใช้ควบคุมความกว้างของแท่งเมื่อเทียบกับช่องว่าง), color, edgecolor และ align ('center' หรือ 'edge') เมธอดนี้คืนค่ารายการอ็อบเจ็กต์ artist ชนิด Rectangle
import matplotlib.pyplot as plt
import numpy as np
categories = ['East', 'West', 'North', 'South']
values = [420, 380, 310, 290]
fig, ax = plt.subplots(figsize=(7, 4))
ax.bar(categories, values, color='steelblue', edgecolor='white', width=0.6)
ax.set_title('Regional Revenue')
ax.set_xlabel('Region')
ax.set_ylabel('Revenue (USD)')
# plt.show()
plt.close()การปรับแต่งลักษณะแท่งกราฟ
การปรับแต่งเล็กน้อยช่วยให้แผนภูมิแท่งอ่านง่ายขึ้นมาก: ใช้สีเน้นสีเดียวกับแท่งทั้งหมด (หรืออาร์เรย์สีเพื่อแยกความแตกต่างของแต่ละแท่ง), เพิ่มป้ายค่าด้านบนแท่งแต่ละแท่งด้วย ax.bar_label(), ควบคุมความกว้างของแท่งเพื่อเว้นพื้นที่ และตั้งค่า ax.set_ylim(0, max * 1.15) เพื่อเว้นที่เหนือแท่งที่สูงที่สุดสำหรับป้ายกำกับ
fig, ax = plt.subplots(figsize=(7, 4))
bars = ax.bar(categories, values, color='steelblue', edgecolor='white', width=0.6)
# Add value labels above bars
ax.bar_label(bars, fmt='%d', padding=3, fontsize=10)
# Give space above bars for labels
ax.set_ylim(0, max(values) * 1.15)
ax.set_title('Regional Revenue')
plt.tight_layout()
plt.close()แผนภูมิแท่งแนวนอนด้วย ax.barh()
ใช้ ax.barh(y, width) สำหรับแผนภูมิแท่งแนวนอน แท่งแนวนอนเหมาะกว่าเมื่อป้ายกำกับหมวดหมู่มีความยาวมาก (อ่านจากซ้ายไปขวาได้เป็นธรรมชาติ) หรือเมื่อมีหลายหมวดหมู่ (จัดเรียงให้กะทัดรัดกว่าได้) พารามิเตอร์การปรับแต่งทั้งหมดใช้ได้เช่นเดียวกัน โดย height ควบคุมความหนาของแท่ง และ ax.barh_label() (หรือ ax.bar_label()) ใช้เพิ่มป้ายข้อความ
import pandas as pd
df = pd.DataFrame({'region': categories, 'revenue': values})
df_sorted = df.sort_values('revenue')
fig, ax = plt.subplots(figsize=(7, 4))
ax.barh(df_sorted['region'], df_sorted['revenue'],
color='steelblue', edgecolor='white', height=0.5)
ax.set_title('Revenue by Region (Sorted)')
ax.set_xlabel('Revenue (USD)')
plt.tight_layout()
plt.close()แผนภูมิแท่งแบบจัดกลุ่ม
หากต้องการเปรียบเทียบหลายกลุ่มแบบวางข้างกัน ให้สร้างแผนภูมิแท่งแบบจัดกลุ่มโดยเลื่อนตำแหน่งแท่งด้วยตนเอง คำนวณตำแหน่งกึ่งกลางของแต่ละกลุ่ม แล้วลบหรือบวกค่าชดเชยคงที่สำหรับกลุ่มย่อยแต่ละกลุ่ม ความกว้างรวมของแท่งบวกช่องว่างระหว่างกลุ่มต้องเท่ากับ 1.0 เพื่อไม่ให้แท่งซ้อนกัน การตั้งค่า ax.set_xticks() จะจัดป้ายขีดแบ่งให้อยู่กึ่งกลางระหว่างแท่งที่จัดกลุ่ม
products = ['A', 'B', 'C']
q1 = [80, 120, 95]
q2 = [90, 110, 105]
x = np.arange(len(products))
width = 0.35
fig, ax = plt.subplots(figsize=(7, 4))
ax.bar(x - width/2, q1, width, label='Q1', color='steelblue')
ax.bar(x + width/2, q2, width, label='Q2', color='coral')
ax.set_xticks(x)
ax.set_xticklabels(products)
ax.legend()
ax.set_title('Q1 vs Q2 Sales by Product')
plt.close()แผนภูมิแท่งแบบซ้อน
แท่งแบบซ้อนแสดงองค์ประกอบของผลรวมจากกลุ่มย่อยหลายกลุ่ม แท่งของกลุ่มที่สองจะเริ่มต้นตรงจุดสิ้นสุดของแท่งกลุ่มแรก โดยใช้พารามิเตอร์ bottom ค่า bottom ของชั้นถัดไปแต่ละชั้นคือผลรวมสะสมของชั้นก่อนหน้าทั้งหมด แท่งแบบซ้อนมีประโยชน์สำหรับแสดงทั้งผลรวมและสัดส่วนของแต่ละองค์ประกอบพร้อมกัน
q1_arr = np.array(q1)
q2_arr = np.array(q2)
fig, ax = plt.subplots(figsize=(7, 4))
ax.bar(products, q1_arr, label='Q1', color='steelblue')
ax.bar(products, q2_arr, bottom=q1_arr, label='Q2', color='coral')
ax.legend()
ax.set_title('Stacked Q1 + Q2 Sales by Product')
ax.set_ylabel('Total Sales')
plt.close()ax.hist() สำหรับฮิสโตแกรม
ax.hist(data, bins) สร้างฮิสโตแกรม พารามิเตอร์ bins ควบคุมจำนวนช่วงที่มีระยะห่างเท่ากันซึ่งใช้แบ่งข้อมูล (ค่าเริ่มต้นคือ 10) คุณยังส่งรายการขอบเขตช่วงที่มีความกว้างไม่เท่ากันได้ด้วย พารามิเตอร์สำคัญ ได้แก่ density=True ซึ่งปรับฮิสโตแกรมให้อยู่ในรูปความหนาแน่นความน่าจะเป็น, edgecolor ซึ่งเพิ่มเส้นขอบระหว่างแท่ง และ color กับ alpha ซึ่งควบคุมลักษณะที่ปรากฏ
np.random.seed(42)
data = np.random.randn(500) # 500 samples from standard normal
fig, ax = plt.subplots(figsize=(7, 4))
ax.hist(data, bins=30, color='steelblue', edgecolor='white', alpha=0.7)
ax.set_title('Distribution of Values')
ax.set_xlabel('Value')
ax.set_ylabel('Count')
plt.close()การเลือกจำนวนช่วง
จำนวนช่วงมีผลอย่างมากต่อรูปลักษณ์ของฮิสโตแกรม หากมีช่วงน้อยเกินไปจะบดบังโครงสร้างของข้อมูล หากมีช่วงมากเกินไปจะทำให้เกิดยอดแหลมที่ดูคล้ายสัญญาณรบกวน แนวทางทั่วไป ได้แก่ กฎของ Sturges (≈ log2(n) + 1), กฎของ Scott หรือกฎของ Freedman-Diaconis โดย Matplotlib รองรับการระบุเป็นสตริงดังนี้: bins='auto', bins='scott', bins='fd' สำหรับการวิเคราะห์เชิงสำรวจ ให้ลองกำหนดค่าด้วยตนเองหลายค่า ส่วนการนำเสนอ ให้เลือกจำนวนช่วงที่สื่อรูปร่างของข้อมูลได้ดีที่สุด
fig, axes = plt.subplots(1, 3, figsize=(12, 4))
for ax, b in zip(axes, [5, 30, 'auto']):
ax.hist(data, bins=b, edgecolor='white', color='steelblue', alpha=0.7)
ax.set_title(f'bins={b}')
ax.set_xlabel('Value')
plt.tight_layout()
plt.close()ฮิสโตแกรมซ้อนทับเพื่อการเปรียบเทียบ
หากต้องการเปรียบเทียบการแจกแจงสองชุดบนแกนเดียวกัน ให้เรียกใช้ ax.hist() สองครั้งกับข้อมูลคนละชุดและใช้สีต่างกัน กำหนด alpha=0.5 ให้ทั้งสองชุดเพื่อให้มองเห็นส่วนที่ซ้อนทับกัน เพิ่มป้ายกำกับแล้วเรียกใช้ ax.legend() การใช้ density=True จะปรับฮิสโตแกรมทั้งสองให้มีมาตราส่วนเดียวกันเมื่อขนาดตัวอย่างแตกต่างกัน ทำให้เปรียบเทียบรูปร่างได้โดยตรง
group_a = np.random.randn(300)
group_b = np.random.randn(300) + 1.5 # shifted right
fig, ax = plt.subplots(figsize=(7, 4))
ax.hist(group_a, bins=25, alpha=0.5, color='steelblue', label='Group A', density=True)
ax.hist(group_b, bins=25, alpha=0.5, color='coral', label='Group B', density=True)
ax.legend()
ax.set_title('Distribution Comparison')
plt.close()การพล็อต Pandas Series และ DataFrames
ทั้ง .plot.bar() และ .plot.hist() พร้อมใช้งานเป็นเมธอดของ DataFrame/Series และสร้างรูป Matplotlib ให้อัตโนมัติ เมธอดเหล่านี้รับพารามิเตอร์ ax เพื่อวาดบน Axes ที่มีอยู่แล้ว วิธีนี้เป็นวิธีที่รวดเร็วที่สุดในการสร้างแผนภูมิแท่งจากข้อมูล Pandas ที่จัดกลุ่มไว้: คำนวณการรวมกลุ่มด้วย groupby เรียกใช้ .plot.bar() กับผลลัพธ์ แล้วปรับแต่ง Axes ที่ส่งคืนมา
import pandas as pd
import numpy as np
df_sales = pd.DataFrame({
'region': ['East', 'West', 'North', 'South'],
'revenue': [420, 380, 310, 290]
}).set_index('region')
fig, ax = plt.subplots(figsize=(7, 4))
df_sales['revenue'].plot.bar(ax=ax, color='steelblue', rot=0)
ax.set_title('Revenue by Region')
plt.tight_layout()
plt.close()การเลือกระหว่างแผนภูมิแท่งกับฮิสโตแกรม
การเลือกใช้แผนภูมิแท่งหรือฮิสโตแกรมขึ้นอยู่กับชนิดข้อมูล ใช้แผนภูมิแท่งเมื่อแกน x แทนหมวดหมู่ที่แยกจากกันและไม่มีลำดับ (เช่น ชื่อผลิตภัณฑ์ ภูมิภาค กลุ่มผู้ใช้) โดยแท่งจะแทนค่าที่รวมแล้วของแต่ละหมวดหมู่ ใช้ฮิสโตแกรมเมื่อแกน x เป็นตัวแปรตัวเลขต่อเนื่อง และต้องการแสดงการกระจายของค่าตลอดช่วงหนึ่ง การสับสนระหว่างสองแบบเป็นข้อผิดพลาดด้านการแสดงผลข้อมูลที่พบบ่อย และอาจทำให้ผู้อ่านเข้าใจชนิดข้อมูลผิด
# Bar chart: categorical x-axis (product names)
products = ['Widget', 'Gadget', 'Doohickey']
revenue = [500, 300, 200]
fig, ax = plt.subplots(figsize=(5, 3))
ax.bar(products, revenue, color='steelblue')
ax.set_title('Revenue per Product (Bar Chart)')
plt.close()
# Histogram: continuous x-axis (order sizes)
order_sizes = np.random.exponential(scale=50, size=300)
fig, ax = plt.subplots(figsize=(5, 3))
ax.hist(order_sizes, bins=20, color='coral', edgecolor='white')
ax.set_title('Distribution of Order Sizes (Histogram)')
plt.close()ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับแผนภูมิแท่งและฮิสโตแกรมจากบทเรียนนี้
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า ax.bar() สร้างแผนภูมิแท่งแนวตั้ง และ ax.barh() สร้างแผนภูมิแท่งแนวนอน; bottom ใช้สร้างแท่งแบบซ้อน; ax.hist() สร้างฮิสโตแกรม โดยควบคุมจำนวนช่วงด้วย bins; และ density=True ปรับมาตรฐานฮิสโตแกรมเพื่อให้เปรียบเทียบกันได้อย่างเป็นธรรม บทถัดไป เราจะเพิ่มป้ายกำกับแกน ชื่อเรื่อง และบันทึกรูปที่มีคุณภาพระดับสิ่งพิมพ์
คำถามที่พบบ่อย
บทเรียน “กราฟแท่งและฮิสโตแกรม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “กราฟแท่งและฮิสโตแกรม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “กราฟแท่งและฮิสโตแกรม”
แสดงจำนวนข้อมูลแบบหมวดหมู่ด้วย ax.bar() และการกระจายของข้อมูลด้วย ax.hist() พร้อมปรับจำนวนช่วงและสีขอบ คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “กราฟแท่งและฮิสโตแกรม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สถาปัตยกรรม Figure และ Axes
- กราฟเส้นและกราฟกระจาย
- กราฟแท่งและฮิสโตแกรม
- ป้ายกำกับ ชื่อเรื่อง และการบันทึกภาพ