φυβλαςのβλογ
phyblas的博客



numpy & matplotlib เบื้องต้น บทที่ ๒๖: การปรับแต่งแถบสี
เขียนเมื่อ 2016/06/12 10:52
แก้ไขล่าสุด 2021/09/28 16:42
ในสองบทที่ผ่านมาเราได้มีการใส่แถบสีเข้าไปด้านข้างเพื่อเป็นตัวอธิบายประกอบแผนภาพไล่สี

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

แต่จริงๆแล้วแถบสีสามารถปรับแต่งอะไรได้อีกมากมายเพื่อให้ได้รูปแบบตามที่ต้องการ



การตั้งค่าต่างๆใน plt.colorbar
แถบสีสามารถปรับแต่งอะไรต่างๆได้ด้วยการเติมคีย์เวิร์ดเข้าไปตอนที่ใช้ plt.colorbar เพื่อสร้าง เช่น
orientation ระบุว่าจะให้อยู่แนวไหน แนวตั้ง vertical แนวนอน horizontal ค่าตั้งต้นคือแนวตั้ง
fraction ขนาดของแถบสีเป็นสัดส่วนกับพื้นที่กราฟทั้งหมด หน่วยเป็นสัดส่วนเต็ม 1 ค่าตั้งต้นคือ 0.15
pad ระยะห่างระหว่างแถบสีกับกราฟ หน่วยเป็นสัดส่วนเต็ม 1 ถ้าหากไม่ใส่จะเป็น 0.05 สำหรับแนวตั้ง 0.15 สำหรับแนวนอน
aspect สัดส่วนระหว่างด้านยาวกับด้านกว้าง
shrink ขนาดของแถบสี ว่าจะให้ย่อลงแค่ไหน หน่วยเป็นสัดส่วนเต็ม 1 ใส่ค่าที่ต่ำกว่า 1 ยิ่งน้อยก็ยิ่งเล็ก
label ข้อความอธิบาย
ticks ค่าที่จะให้มีขีดและตัวเลขบอก
extend ทำแถบสีให้มีปลายแหลม ถ้าต้องการให้ฝั่งค่ามากเป็นแหลมก็ใส่ว่า max ถ้าฝั่งค่าน้อยเป็น min ถ้าต้องการให้แหลมสองฝั่งใส่ both

ตัวอย่าง ลองสร้างแถบสีแนวนอน
import numpy as np
import matplotlib.pyplot as plt
x,y = np.meshgrid(np.linspace(-20,20,101),np.linspace(-10,10,101))
z = np.cos(x/5)**2+np.cos(y/5)**2
plt.pcolor(x,y,z,cmap='terrain')
plt.colorbar(orientation='horizontal')
plt.show()



สามารถปรับให้แถบสีมาอยู่ติดกับตัวกราฟได้โดยใส่ pad=0
x,y = np.meshgrid(np.linspace(-10,10,101),np.linspace(-10,10,101))
z = np.cos(x)+np.cos(y)
plt.pcolor(x,y,z,cmap='terrain')
plt.colorbar(pad=0)
plt.show()



ค่าบางอย่างไม่สามารถปรับได้โดยใส่คีย์เวิร์ดตอนสร้าง แต่สามารถเอาตัวแปรมารับค่าเพื่อใช้เมธอดมาตั้งปรับค่า เช่นตั้งข้อความที่ขีดบอกค่า ใช้ set_ticklabels

สามารถเปลี่ยนข้อความที่เส้นขีดได้ เช่นใช้ตัวอักษรเป็นขีดบอก
x,y = np.meshgrid(np.linspace(-10,10,101),np.linspace(-10,10,101))
z = (np.cos(x)**2+np.cos(y)**2)*(x**2+y**2)
plt.pcolor(x,y,z,cmap='terrain')
cb = plt.colorbar(ticks=[50,150,250,350])
cb.set_ticklabels(['a','b','c','d'])
plt.show()



ลองทำให้แถบสีเป็นหัวแหลมชี้ด้านบน แล้วก็ปรับขนาดให้กว้างดู
x,y = np.meshgrid(np.linspace(10,20,101),np.linspace(10,20,101))
z = 1/x+1/y
plt.pcolor(x,y,z,cmap='terrain')
cb = plt.colorbar(aspect=3,fraction=0.3,extend='min')
plt.show()



นอกจากนี้ก็ยังปรับอะไรได้อีกมาก ลองไปปรับแต่งกันดูได้



สร้าง axes ขึ้นมาเพื่อใส่แถบสีโดยเฉพาะ
จากตัวอย่างที่ผ่านๆมาจะเห็นว่าพอสร้างแถบสีขึ้นด้วย plt.colorbar มันจะถูกวางโดยไปเบียดเข้ากับแกนเดิมที่มีอยู่ จัดสันปันส่วนตามค่าที่เรากำหนด

แต่มีอีกวิธีหนึ่งในการจัดวางแถบสีคือการสร้าง axes เฉพาะขึ้นมาเพื่อจัดวางแถบสีลงไป

เราสามารถทำได้โดยการใส่คีย์เวิร์ด cax ลงใน plt.colorbar ค่าที่ใส่ก็คือออบเจ็กต์แทน axes ที่ต้องการใช้เป็นแถบสี

วิธีที่อาจทำได้ง่ายๆก็คืออาจใช้ subplot เพื่อสร้างกราฟย่อยมาสองอัน แล้วให้อันนึงเป็นแถบสีไปเลย เช่น
x,y = np.meshgrid(np.linspace(-20,20,101),np.linspace(-10,10,101))
z = np.cos(x/5)**2+np.cos(y/5)**2
plt.subplot(2,1,1)
plt.pcolor(x,y,z,cmap='rainbow')
ax_cb = plt.subplot(2,1,2)
plt.colorbar(cax=ax_cb,orientation='horizontal')
plt.show()



พอทำแบบนี้แล้ว subplot ด้านล่างก็จะกลายเป็นสีไป

หรืออาจใช้ฟังก์ชัน plt.axes เพื่อกำหนดขนาดปันส่วนอย่างอิสระ เช่น
x,y = np.meshgrid(np.linspace(-20,20,101),np.linspace(-10,10,101))
z = np.cos(x**2/5)**2+np.cos(y**2/5)**2
plt.axes([0.05,0.05,0.8,0.9])
plt.pcolor(x,y,z,cmap='cubehelix')
ax_cb = plt.axes([0.86,0.05,0.07,0.9])
plt.colorbar(cax=ax_cb)
plt.show()





การสร้างให้กราฟย่อยหลายอันใช้แถบสีร่วมกัน
บางครั้งเราอาจต้องการวาดแผนภาพไล่สีหลายๆอันแล้วเอามารวมกัน แต่ว่าแถบสีจะจำเพาะต่อกราฟอันเดียวเท่านั้น เพราะแถบสีจะถูกสร้างขึ้นคู่กับกราฟที่เพิ่งสร้างมาตัวล่าสุด

หากเราสร้างกราฟย่อยและต้องการให้แต่ละอันมีแถบสีก็ทำได้โดย
x,y = np.meshgrid(np.linspace(-10,10,201),np.linspace(-4,4,201))
z1 = np.sin(x**2+y**2)
z2 = np.sin(x**2+y**2)**2
plt.subplot(2,1,1)
plt.pcolor(x,y,z1,cmap='CMRmap')
plt.colorbar()
plt.subplot(2,1,2)
plt.pcolor(x,y,z2,cmap='CMRmap')
plt.colorbar()
plt.show()



ทำแบบนี้จะได้แถบสีมาสองอัน ซึ่งมีมาตราส่วนต่างกัน หากเราต้องการเปรียบเทียบแผนภาพทั้งสองนี้ก็คงจะทำได้ยาก

ตรงนี้เราก็อาจแก้ปัญหาด้วยการแค่ใส่ vmin vmax ลงไปให้แผนภาพทั้งสองเท่ากัน แบบนี้แผนภาพไล่สีทั้งสองก็จะเป็นมาตราส่วนเดียวกัน และแถบสีก็จะออกมาเหมือนกันด้วย

ซึ่งพอทำแบบนี้แล้วเราก็คงไม่จำเป็นจะต้องอุตส่าห์สร้างแถบสีขึ้นมาถึงสองอันแล้ว เพราะยังไงก็เหมือนกัน

แต่หากเราตัด plt.colorbar() ออกไปอันนึงดื้อๆเลย ผลที่ได้ก็จะออกมาประหลาด เช่นแบบนี้
x,y = np.meshgrid(np.linspace(-10,10,201),np.linspace(-4,4,201))
z1 = np.sin(x**2+y**2)
z2 = np.sin(x**2+y**2)**2
plt.subplot(2,1,1)
plt.pcolor(x,y,z1,cmap='CMRmap',vmin=-1,vmax=1)
plt.subplot(2,1,2)
plt.pcolor(x,y,z2,cmap='CMRmap',vmin=-1,vmax=1)
plt.colorbar()
plt.show()



นั่นเพราะแถบสีจะไปผูกติดกับแผนภาพอันที่สองซึ่งสร้างมาทีหลัง

ดังนั้นกรณีเช่นนี้จำเป็นจะต้องสร้าง axes สำหรับวางแถบสี โดยจัดสรรปันส่วนพื้นที่เอาเอง วิธีการก็มีหลากหลาย ในที่นี้จะลองใช้ plt.subplot2grid
x,y = np.meshgrid(np.linspace(-10,10,201),np.linspace(-4,4,201))
z1 = np.sin(x**2+y**2)
z2 = np.sin(x**2+y**2)**2
plt.subplot2grid((6,11),(0,0),rowspan=3,colspan=10)
plt.pcolor(x,y,z1,cmap='CMRmap',vmin=-1,vmax=1)
plt.subplot2grid((6,11),(3,0),rowspan=3,colspan=10)
plt.pcolor(x,y,z2,cmap='CMRmap',vmin=-1,vmax=1)
ax_cb = plt.subplot2grid((6,11),(0,10),rowspan=6,colspan=1)
plt.colorbar(cax=ax_cb)
plt.subplots_adjust(0.05,0.05,0.92,0.95,0.4,0.4)
plt.show()



เกี่ยวกับ plt.subplot2grid และ plt.axes หากใครยังไม่ค่อยเข้าใจอาจต้องลองไปอ่านบทที่ ๑๐



อ้างอิง


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


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

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

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

หมวดหมู่

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

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

目录

从日本来的名言
模块
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
机器学习
-- 神经网络
javascript
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



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

  查看日志

  推荐日志

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