φυβλαςのβλογ
บล็อกของ phyblas



numpy & matplotlib เบื้องต้น บทที่ ๑๔: แผนภูมิวงกลม
เขียนเมื่อ 2016/06/11 22:22
แก้ไขล่าสุด 2021/09/28 16:42
นอกจากกราฟเส้นและแผนภูมิแท่งแล้ว แผนภูมิที่มักเจอบ่อยอีกอย่างก็คือแผนภูมิวงกลม มีไว้สำหรับเปรียบเทียบสัดส่วนของสิ่งต่างๆ



การสร้างแผนภูมิวงกลม
สามารถสร้างขึ้นมาได้โดยฟังก์ชัน pie โดยใส่อาร์กิวเมนต์ตัวแรกเป็นลิสต์หรืออาเรย์ของปริมาณตัวต่างๆ

ตัวอย่าง
import matplotlib.pyplot as plt
plt.figure(figsize=[7,7]) # กำหนดฉากให้เป็นจตุรัสเพื่อที่แผนภาพจะได้เป็นวงกลมสวย
plt.pie([1,5,3,4])
plt.show()



ผลทีได้คือกราฟวงกลมที่แบ่งเป็น ๔ ส่วนตามสัดส่วนที่ใส่เข้าไป แต่จะเห็นว่ายังโล่งๆอยู่ดังนั้นต้องเพิ่มคีย์เวิร์ดเข้าไปเพื่อแต่งเติม
explode กำหนดว่าจะให้ส่วนไหนยื่นออกมาแค่ไหน (เหมือนแบ่งพิซซาออกมา) ใส่เป็นลิสต์ของระยะในการเลื่อนของแต่ละส่วน
labels ลิสต์ของชื่อของแต่ละส่วน ถ้าไม่ใส่ก็จะไม่มีชื่อ
colors ลิสต์ของสีของแต่ละส่วน ถ้าไม่ใส่ก็จะไล่เป็น น้ำเงิน > เขียว > แดง > ...
autopct กำหนดรูปแบบการแสดงผลตัวเลขเปอร์เซ็นต์บนแผนภาพ ถ้าไม่ใส่ก็จะไม่มี
shadow กำหนดว่ามีเงาหรือไม่ =1 คือใส่เงา ถ้าไม่ใส่คือไม่มี
startangle มุมกวาดเริ่มต้น ถ้าไม่ใส่จะเริ่มที่มุม 0 องศา คือด้านขวาสุด หน่วยเป็นองศา
counterclock กำหนดว่าจะไล่ทวนเข็มนาฬิกาหรือไม่ ถ้าใส่ =0 จะไล่ตามเข็ม ถ้าไม่ใส่อะไรก็จะไล่ทวนเข็ม

autopct นั้นถ้าต้องการให้ขึ้นเป็นจำนวนเต็มก็ใส่ %d ถ้ามีทศนิยมด้วยก็ใส่ %f และสามารถใส่รายละเอียดเพิ่มเติมได้ตามรูปแบบการจัดการรูปแบบการแสดงผล รายละเอียดอ่านในเนื้อหาภาษาไพธอนเบื้องต้นบทที่ ๑๐

ที่ต้องระวังคือหากจะใส่ เครื่องหมายเปอร์เซ็นต์ % ลงไปจะต้องใส่เป็นสองอันติดกัน %% แล้วเวลาที่ปรากฏจะออกมาแค่ตัวเดียว เพราะ % เป็นสัญลักษณ์พิเศษจึงมีวิธีการเขียนที่พิเศษหน่อย

ลองเขียนใหม่โดยเพิ่มคีย์เวิร์ดทั้ง ๗ ลงไป
labels = ['hoge','fuga','piyo','hogera'] # กำหนดชื่อแต่ละส่วน
explode = [0.2,0,0,0] # เฉพาะส่วนแรกให้ยื่นออกมา
colors = ['#FF3388','#EE7722','#22EE44','#33FFAA'] # กำหนดสีให้ต่างกันทั้งหมด
plt.figure(figsize=[7,7])
plt.pie([1,5,3,4],autopct='%d%%',shadow=1,counterclock=0,startangle=90,labels=labels,explode=explode,colors=colors)
plt.show()



คราวนี้จะออกมาดูสมบูรณ์ขึ้น แต่ก็ยังดูมีอะไรที่น่าจะต้องเพิ่มเติมอีก เช่นตัวหนังสือยังดูเล็กไป



การปรับตัวหนังสือ
ตอนที่ใช้ฟังก์ชัน pie เพื่อวาดแผนภาพวงกลมนั้นหากนำตัวแปรอะไรมารับก็จะได้ลิสต์ซึ่งมีสมาชิก ๓ ตัว
- ตัวแรก ลิสต์ของออบเจ็กต์ของแถบในแต่ละส่วน
- ตัวที่สอง ลิสต์ของออบเจ็กต์รายการของแต่ละแถบ
- ตัวหลัง ลิสต์ของออบเจ็กต์ค่าตัวเลขของแต่ละแถบ

เรา สามารถเอาตัวแปร ๓ ตัวมารับค่าแต่ละตัวที่คืนกลับมาได้ และในแต่ละอันจะประกอบด้วยสมาชิกย่อยเป็นออบเจ็กต์ตามจำนวนข้อมูลที่เราใส่ ลงไป เช่นในตัวอย่างนี้เราใส่ข้อมูลไปสี่อันก็ควรจะมีออบเจ็กต์ย่อยอยู่ข้างใน ๔ ตัว

ออบเจ็กต์ข้อความกับค่าตัวเลขของแต่ละแถบนั้นสามารถปรับค่าอะไรต่างๆได้ตามที่ต้องการ

เราอาจใช้การวนซ้ำด้วย for เพื่อเข้าไปปรับค่าของแต่ละตัว

ลองมาปรับสีกับแบบตัวอักษรดู ปรับมาใช้ฟอนต์ JasmineUPC แล้วก็จะสามารถใช้ภาษาไทยได้ ดังนั้นก็ถือโอกาสเปลี่ยนเป็นภาษาไทยด้วย
import matplotlib.pyplot as plt
import matplotlib as mpl
fp = mpl.font_manager.FontProperties(family='Tahoma',size=40)
labels = [u'โฮเงะ',u'ฟุงะ',u'ปิโยะ',u'โฮเงระ']
explode = [0.2,0,0,0]
colors = ['#FF3388','#EE7722','#22EE44','#33FFAA']
plt.figure(figsize=[7,7])
thaep, raikan, kha = plt.pie([1,5,3,4],autopct='%d%%',shadow=1,counterclock=0,startangle=90,labels=labels,explode=explode,colors=colors)
# ตั้งค่าตัวอักษรของรายการ
for i in range(len(raikan)):
    raikan[i].set_fontproperties(fp) # เปลี่ยนฟอนต์และขนาด
    raikan[i].set_color(colors[i]) # เปลี่ยนสีอักษร
# ตั้งค่าตัวอักษรของค่า
for t in kha:
    t.set_fontproperties(fp) # เปลี่ยนฟอนต์และขนาด
plt.show()



มีวิธีที่อาจง่ายกว่าการใช้ for วนซ้ำเพื่อปรับค่าทีละตัว นั่นคือใช้ฟังก์ชัน plt.setp ฟังก์ชันนี้มีไว้ใช้ตั้งค่าคุณสมบัติต่างๆให้กับออบเจ็กต์ซึ่งอาจทำพร้อมกัน ทีละหลายๆตัวได้

ถ้าเราใช้ฟังก์ชันนี้กับลิสต์ของออบเจ็กต์ โดยในที่นี้รวมทั้งรายการและค่าของแถบ ก็จะเปลี่ยนค่าต่างๆของตัวหนังสือได้พร้อมกันทีเดียว และในที่นี้ raikan และ kha อยู่ในรูปของลิสต์อยู่แล้วจึงใช้ได้ทันที

ลองเขียนใหม่ตามนี้ (มีการแก้แค่ ๓บรรทัดล่าง)
fp = mpl.font_manager.FontProperties(family='Tahoma',size=40)
labels = [u'โฮเงะ',u'ฟุงะ',u'ปิโยะ',u'โฮเงระ']
explode = [0.2,0,0,0]
colors = ['#FF3388','#EE7722','#22EE44','#33FFAA']
plt.figure(figsize=[7,7])
thaep, raikan, kha = plt.pie([1,5,3,4],autopct='%d%%',shadow=1,counterclock=0,startangle=90,labels=labels,explode=explode,colors=colors)
plt.setp(raikan+kha,fontproperties=fp,color='#880033',rotation=-45)
plt.show()



เพียงแต่ว่าการตั้งค่าพร้อมกันทีเดียวแบบนี้จะทำให้ค่าทุกตัวเหมือนกันหมด ดังนั้นหากอยากปรับทีละตัวก็ยังต้องใช้ for อยู่



การเปลี่ยนการแสดงค่า
เมื่อเรากำหนดค่าลงในคีย์เวิร์ด autopct ค่าที่ออกมานั้นคือสัดส่วนเป็นเปอร์เซ็นต์แทนที่จะเป็นค่าของข้อมูลตามที่เราใส่ลงไป

แต่เราสามารถแก้ให้เป็นไปตามที่ต้องการได้โดยใช้ for แบบเดียวกับที่ปรับฟอนต์และสี

ในที่นี้จะลองปรับให้แสดงทั้งค่าจริงและค่าเป็นเปอร์เซ็นต์
fp = mpl.font_manager.FontProperties(family='Tahoma',size=30)
values = [1,5,3,4] # ค่าของข้อมูล
labels = [u'โฮเงะ',u'ฟุงะ',u'ปิโยะ',u'โฮเงระ']
explode = [0.2,0,0,0]
colors = ['#FF3388','#EE7722','#22EE44','#33FFAA']
plt.figure(figsize=[7,7])
thaep, raikan, kha = plt.pie(values,autopct='%.1f%%',shadow=1,counterclock=0,startangle=60,labels=labels,explode=explode,colors=colors)
# ตั้งค่าตัวอักษรของรายการ
for i in range(len(raikan)):
    raikan[i].set_fontproperties(fp) # เปลี่ยนฟอนต์และขนาด
    raikan[i].set_color(colors[i]) # เปลี่ยนสีอักษร
fp.set_size(27) # ปรับขนาดอักษรให้เล็กลง
# ตั้งค่าตัวอักษรของค่า
for i in range(len(kha)):
    kha[i].set_fontproperties(fp) # เปลี่ยนฟอนต์และขนาด
    kha[i].set_color('#770077') # เปลี่ยนสีอักษร
    percent = kha[i].get_text() # รับเอาค่าเปอร์เซ็นต์จากข้อความเดิม
    kha[i].set_text('%d\n(%s)'%(values[i],percent)) #แก้ข้อความเป็นค่าตัวเลขเดิม และวงเล็บเปอร์เซ็นต์ไว้
plt.show()





อ้างอิง


<< บทที่แล้ว     บทถัดไป >>
หน้าสารบัญ


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python >> matplotlib

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文