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



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

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

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



การตั้งค่าต่างๆใน 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

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
python
-- numpy
-- matplotlib

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

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



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

  ค้นหาบทความ

  บทความแนะนำ

หลักการเขียนทับศัพท์ภาษาจีนกวางตุ้ง
การใช้ unix shell เบื้องต้น ใน linux และ mac
หลักการเขียนทับศัพท์ภาษาจีนกลาง
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
บันทึกการเที่ยวสวีเดน 1-12 พ.ค. 2014
แนะนำองค์การวิจัยและพัฒนาการสำรวจอวกาศญี่ปุ่น (JAXA)
เล่าประสบการณ์ค่ายอบรมวิชาการทางดาราศาสตร์โดยโซวเคนได 10 - 16 พ.ย. 2013
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
บันทึกการเที่ยวญี่ปุ่นครั้งแรกในชีวิต - ทุกอย่างเริ่มต้นที่สนามบินนานาชาติคันไซ
หลักการเขียนทับศัพท์ภาษาญี่ปุ่น
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ
ทำไมถึงอยากมาเรียนต่อนอก
เหตุผลอะไรที่ต้องใช้ภาษาวิบัติ?

ไทย

日本語

中文