ใน
บทที่ ๙ ได้พูดถึงการจัดการอะไรต่างๆมากมายบนแกนในเบื้องต้น ซึ่งรวมถึงการแก้ไขในส่วนของขีดบอกค่าบนแกนด้วย สำหรับบทนี้จะพูดถึงต่อในส่วนของการปรับในรายละเอียดขึ้นไปอีก
การแบ่งขีดเป็นขีดหลักและขีดรอง หากมองไปที่ไม้บรรทัดจะเห็นว่าประกอบไปด้วยเส้นขีดมากมายซึ่งแสดงบอกค่าเส้นขีดนั้นไม่ได้ยาวเท่ากันทั้งหมด แต่บางขีดยาวบางขีดสั้น เช่นเส้นที่บอกหน่วยเซนติเมตรอาจทั้งยาวและหนาว่าเส้นที่บอกหน่วยมิลลิเมตร
กราฟใน matplotlib เองก็สามารถทำให้ขีดบอกบนแกนแบ่งออกเป็นขีดหลักซึ่งยาวกว่าและขีดย่อยซึ่งสั้นกว่าแบบนั้นได้เช่นกัน
ในเบื้องต้นเราสามารถตั้งให้แสดงขีดย่อยขึ้นมาได้โดยใช้ฟังก์ชัน plt.minorticks_on เช่น
import numpy as np
import matplotlib.pyplot as plt
ax = plt.axes(xlim=[-10,10],ylim=[-8,8],aspect=1,facecolor='#ddffdd')
plt.plot(np.array([-9,0,9]),np.array([-7,2,7]),'o-r')
plt.minorticks_on()
plt.show()
จะเห็นว่ามีขีดเล็กๆสั้นๆปรากฏขึ้นมาจำนวนหนึ่งระหว่างขีดหลัก เพียงแต่ว่าอาจเล็กมาจนมองแทบไม่เห็น ดังนั้นอาจต้องทำการตกแต่งเพิ่มเติมสักหน่อย
การปรับแต่งขีดย่อยทำได้โดยใช้ฟังก์ชัน plt.tick_params ซึ่งได้อธิบายไปใน
บทที่ ๙ แล้ว เพียงแต่โดยปกติแล้วถ้าเราไม่ได้ระบุอะไรจะเป็นการปรับแต่งขีดหลัก แต่เราสามารถปรับแต่งขีดย่อได้โดยเพิ่มคีย์เวิร์ด which ลงไป
which='major' คือปรับแค่ขีดหลัก (นี่เป็นค่าตั้งต้น)
which='minor' คือปรับแค่ขีดย่อย
which='both' คือปรับทั้งขีดหลักและขีดย่อย
ตัวอย่าง ลองพิมพ์ตามนี้เพิ่มเข้าไปจากตัวอย่างด้านบนจะเห็นความเปลี่ยนแปลงของทั้งขีดหลักและขีดย่อย
plt.tick_params(colors='b',length=30,direction='inout')
plt.tick_params(which='both',width=3)
plt.tick_params(which='minor',colors='m',length=10,top=1)
การจัดตำแหน่งขีดบอกค่า จะเห็นว่าโดยรูปแบบตั้งต้นแล้วเส้นขีดย่อยถูกขีดเพิ่มตามความเหมาะสมโดยกำหนดอัตโนมัติ และไม่มีตัวเลข
ที่จริงตำแหน่งเส้นขีดหลักเองก็ถูกกำหนดขึ้นมาโดยอัตโนมัติเหมือนกัน แต่เราสามารถปรับแก้ได้ด้วยการใช้ plt.xticks ดังที่กล่าวไปใน
บทที่ ๗ แต่วิธีนั้นเราต้องเตรียมค่าขีดทั้งหมดที่ต้องการไปใส่เอง อีกทั้งไม่สามารถใช้กับเส้นขีดรองได้
มีอีกวิธีหนึ่งที่สามารถปรับตำแหน่งเส้นขีด ซึ่งแม้ว่าจะเข้าใจยากกว่าแต่เป็นวิธีที่สะดวกและยืดหยุ่นกว่า และยังใช้ได้กับทั้งเส้นขีดหลักและเส้นขีดรอง นั่นคือการตั้ง set_major_locator และ set_minor_locator ที่แอตทริบิวต์ xaxis และ yaxis ของ axes
ค่าที่ต้องใส่ใน set_major_locator และ set_minor_locator นั้นต้องเป็นออบเจ็กต์ที่อยู่ในซับคลาสของ matplotlib.ticker.Locator ซึ่งอยู่ในมอดูลย่อยอันหนึ่งของ matplotlib ที่ชื่อ ticker
ซับคลาสของ Locator มีอยู่หลายชนิด เช่น
MultipleLocator |
วางขีดให้เว้นระยะห่างเท่ากันตามระยะที่กำหนด |
LinearLocator |
วางขีดเป็นระยะห่างเท่ากันตามจำนวนที่กำหนด |
MaxNLocator |
วางขีดให้ห่างเท่ากันโดยแบ่งเป็นจำนวนไม่เกินที่กำหนด โดยเลขจะถูกวางให้เป็นเลขลงตัว |
IndexLocator |
วางขีดเฉพาะในขอบเขตที่มีจุดข้อมูลบนกราฟ |
FixedLocator |
วางขีดในตำแหน่งที่กำหนด |
LogLocator |
วางขีดตามตำแหน่งค่าเลขยกกำลัง |
AutoMinorLocator |
ใช้กับขีดย่อย วางขีดย่อยโดยแบ่งย่อยจากขีดหลักตามจำนวนที่กำหนด |
NullLocator |
ไม่วาดขีด |
การใช้ MultipleLocator เป็นการตั้งให้ขีดเว้นระยะห่างเท่ากันหมด โดยเราต้องกำหนดระยะห่างตามที่ต้องการโดยใส่เป็นอาร์กิวเมนต์
ตัวอย่าง
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
ax = plt.axes(xlim=[-10,10],ylim=[-8,8],aspect=1,facecolor='#ddffdd')
plt.plot(np.array([-1,0,5]),np.array([-7,2,6]),'o-m')
plt.plot(np.array([-8,-1,1]),np.array([-6,1,7]),'o-r')
plt.minorticks_on()
plt.tick_params(colors='b',length=20)
plt.tick_params(which='both',width=3)
plt.tick_params(which='minor',colors='c',length=10)
ax.xaxis.set_major_locator(mpl.ticker.MultipleLocator(6))
ax.xaxis.set_minor_locator(mpl.ticker.MultipleLocator(2))
ax.yaxis.set_major_locator(mpl.ticker.MultipleLocator(5))
ax.yaxis.set_minor_locator(mpl.ticker.MultipleLocator(1.5))
plt.show()
ส่วน LinearLocator จะคล้ายกับ MultipleLocator ตรงที่เป็นการแบ่งเท่าๆกันเหมือนกัน แต่จะกำหนดจำนวนขีดเอา
ลองแก้ ๔ บรรทัดที่ใช้ MultipleLocator เป็น
ax.xaxis.set_major_locator(mpl.ticker.LinearLocator(6))
ax.xaxis.set_minor_locator(mpl.ticker.LinearLocator(36))
ax.yaxis.set_major_locator(mpl.ticker.LinearLocator(5))
ax.yaxis.set_minor_locator(mpl.ticker.LinearLocator(16))
สำหรับ MaxNLocator จะกำหนดขีดอัตโนมัติตามความเหมาะสมโดยเราสามารถกำหนดจำนวนช่องแบ่งสูงสุดได้
อาร์กิวเมนต์ที่ต้องใส่คือจำนวนช่องแบ่งสูงสุด และนอกจากนี้ยังอาจใส่คีย์เวิร์ดเพิ่มเติม ได้แก่
integer ถ้าเป็น 1 ขีดจะวางเฉพาะที่เป็นค่าจำนวนเต็มเท่านั้น
symmetric ถ้าเป็น 1 ขีดจะวางโดยมีสมมาตรบวกลบ
prune กำหนดว่าจะเอาขีดที่ชิดขอบออกหรือไม่ ถ้าเป็น upper จะละขีดค่าฝั่งมากสุด lower จะละขีดค่าฝั่งน้อยสุด both จะละทั้งสองฝั่ง
ลองแก้เป็น
ax.xaxis.set_major_locator(mpl.ticker.MaxNLocator(6))
ax.xaxis.set_minor_locator(mpl.ticker.MaxNLocator(36,integer=1,prune='both'))
ax.yaxis.set_major_locator(mpl.ticker.MaxNLocator(5,prune='upper'))
ax.yaxis.set_minor_locator(mpl.ticker.MaxNLocator(35,prune='lower'))
IndexLocator จะวางขีดแค่ในช่วงที่มีจุดข้อมูลอยู่เท่านั้น โดยอาร์กิวเมนต์ที่ต้องใส่มีสองตัวคือ ระยะห่างระหว่างขีด และ จุดเริ่มต้นโดยกำหนดเป็นระยะห่างจากข้อมูลตัวที่ค่าต่ำสุด
ตัวอย่าง
ax.xaxis.set_major_locator(mpl.ticker.IndexLocator(5,1))
ax.xaxis.set_minor_locator(mpl.ticker.IndexLocator(2,0))
ax.yaxis.set_major_locator(mpl.ticker.IndexLocator(3,2))
ax.yaxis.set_minor_locator(mpl.ticker.IndexLocator(1,0))
สำหรับ FixedLocator นั้นจะวาดขีดในตำแหน่งตามที่ระบุ คล้ายกับการใช้วิธีการกำหนดตำแหน่งขีดโดย set_xticks และ set_yticks
AutoMinorLocator จะใช้กับ set_minor_locator เพื่อกำหนดขีดย่อยให้แบ่งย่อยขีดหลักตามจำนวนที่กำหนด ขีดย่อยจะไม่ไปซ้อนทับกับขีดหลัก
ตัวอย่าง
ax.xaxis.set_major_locator(mpl.ticker.MultipleLocator(7))
ax.xaxis.set_minor_locator(mpl.ticker.AutoMinorLocator(4))
ax.yaxis.set_major_locator(mpl.ticker.LinearLocator(9))
ax.yaxis.set_minor_locator(mpl.ticker.AutoMinorLocator(5))
การจัดรูปแบบตัวเลขบนขีดบอกค่า ปกติแล้วรูปแบบการแสดงผลของตัวเลขจะถูกกำหนดอย่างอัตโนมัติ แต่เราสามารถกำหนดขึ้นเองได้โดยเมธอด set_major_formatter กับ set_minor_formatter บน xaxis และ yaxis
ออบเจ็กต์ที่ต้องใช้กับ set_major_formatter และ set_minor_formatter ต้องเป็นซับคลาสของคลาส matplotlib.ticker.Formatter ซึ่งอยู่ภายใน matplotlib.ticker เช่นกัน
ออบเจ็กต์เหล่านั้นมีหลายตัว แต่ที่จะพูดถึงในที่นี้ได้แก่
FormatStrFormatter |
กำหนดรูปแบบด้วย %d %f %e %s |
FuncFormatter |
กำหนดรูปแบบด้วยฟังก์ชัน |
FixedFormatter |
กำหนดตัวหนังสือบนขีดทีละขีดเอาเองโดยใช้ลิสต์ |
NullFormatter |
ไม่เขียนตัวเลข |
FormatStrFormatter เป็นการกำหนดรูปแบบการแสดงผลของตัวเลขด้วย %d, %f, %e, ฯลฯ รายละเอียดเกี่ยวกับความหมายของการเขียนแบบนี้อ่านได้ในเนื้อหา
ภาษาไพธอนเบื้องต้นบทที่ ๑๐ อาร์กิวเมนต์ที่ต้องใส่คือสายอักขระที่ประกอบด้วย %d, %f, %e อยู่ในนั้น ซึ่งค่าตัวเลขบอกค่าจะถูกแทนลงตรงนั้น และสามารถเพิ่มเติมอะไรอย่างอื่นได้ตามที่ต้องการ
ตัวอย่าง