φυβλαςのβλογ
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
モンゴル語
言語学
maya
確率論
日本での日記
中国での日記
-- 北京での日記
-- 香港での日記
-- 澳門での日記
台灣での日記
北欧での日記
他の国での日記
qiita
その他の記事

記事の類別



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

  記事を検索

  おすすめの記事

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

ไทย

日本語

中文