นอกจากกราฟเส้นและแผนภูมิแท่งแล้ว แผนภูมิที่มักเจอบ่อยอีกอย่างก็คือแผนภูมิวงกลม มีไว้สำหรับเปรียบเทียบสัดส่วนของสิ่งต่างๆ
การสร้างแผนภูมิวงกลม สามารถสร้างขึ้นมาได้โดยฟังก์ชัน 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()
อ้างอิง