φυβλαςのβλογ
phyblasのブログ



numpy & matplotlib เบื้องต้น บทที่ ๑๖: แผนภาพการกระจาย
เขียนเมื่อ 2016/06/11 22:46
แก้ไขล่าสุด 2022/07/21 20:29
matplotlib มีคำสั่งที่ใช้ในการวาดแผนภาพการกระจายซึ่งมีไว้แสดงการแจกแจงของค่าต่างๆ นั่นคือ plt.scatter

การเขียนแผนภาพการกระจายจะคล้ายกับการเขียนกราฟเส้น เพียงแต่ไม่มีเส้น ส่วนคีย์เวิร์ดต่างๆมีคล้ายกัน และบางส่วนก็ต่างกัน

ลองเริ่มจากลองวาดแผนภาพการกระจายของการแจกแจงแบบปกติขึ้นมาเป็นตัวอย่างที่ง่ายที่สุด
import numpy as np
import matplotlib.pyplot as plt

x = np.random.randn(1000) # สุ่มค่า x
y = np.random.randn(1000) # สุ่มค่า y
plt.figure(figsize=[7,7]) # กำหนดขนาดภาพให้เป็นจตุรัส
plt.scatter(x,y) # วาดแผนภาพการกระจาย
plt.show()



จะเห็นว่าตรงกลางภาพซ้อนทับกันหนาแน่นไปหมด แบบนี้ดูความเปลี่ยนแปลงในการแจกแจงได้ยาก ดังนั้นอาจใส่ความโปร่งใสลงไปด้วยคีย์เวิร์ด alpha

นอกจากนี้ทั้งสี, รูปแบบ และขนาดของจุด ก็ทำได้เหมือนกับกราฟเส้น

คีย์เวิร์ดของแผนภาพการกระจายที่มักใช้บ่อย ได้แก่
color หรือ c สีของจุด
size หรือ s ขนาดของจุด
marker รูปแบบของจุด
alpha ความโปร่งใส
label ข้อความอธิบาย
linewidth หรือ lw ความกว้างขอบของจุด

จะเห็นว่าส่วนใหญ่ก็คล้ายกับกราฟเส้น แต่บางอย่างที่เหมือนกันแต่ชื่อต่างกันก็มี

linewidth หรือ lw นั้นถ้าเป็นใน plot จะเป็นความกว้างของเส้น แต่ใน scatter จะเป็นความกว้างของเส้นขอบจุด

ลองใส่คีย์เวิร์ดอะไรต่างๆ พร้อมทั้งกำหนดขอบเขตของกราฟเพิ่มเข้าไปด้วย แล้วดูกราฟใหม่อีกรอบ
x = np.random.randn(1000)
y = np.random.randn(1000)
plt.figure(figsize=[7,7])
plt.axes(xlim=[-4,4],ylim=[-4,4]) # กำหนดขอบเขต
plt.scatter(x,y,alpha=0.15,marker='o',s=50,c='#FFAA66',lw=0)
plt.show()



เท่านี้ก็จะเห็นการกระจายที่สวยงามมากขึ้น

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

คีย์เวิร์ด c กับ s นั้นถ้าใส่เป็นข้อมูลเดี่ยวก็จะได้สีและขนาดเท่ากันหมดแต่ถ้าใส่เป็นลิสต์ ที่มีจำนวนเท่ากับจำนวนจุดก็จะได้จุดที่มีสีและขนาดต่างๆกันไป

ที่จริงแล้ว c กับ color นั้นมีข้อแตกต่างกันอยู่ และ s กับ size ก็มีข้อแตกต่างกัน คือ c กับ s จะใส่เป็นข้อมูลเดี่ยวหรือกลุ่มก็ได้ แต่ color กับ size จะต้องใส่เป็นข้อมูลเดี่ยวเท่านั้น นั่นคือสีเดียวและขนาดเดียว

เราลองสร้างชุดข้อมูลสุ่มขึ้นมาอีกอัน ไว้เป็นตัวกำหนดสีและขนาด ขนาดในที่นี้จะลองให้กำหนดจากระยะทาง ถ้าสมมุติว่าเรากำลังมองทรงกลมที่มีขนาดเท่ากันแต่อยู่ห่างไม่เท่ากันก็จะ เห็นอันที่ใกล้กว่ามีขนาดใหญ่กว่า โดยขนาดปรากฏแปรผกผันกับระยะทาง ทำแบบนี้แล้วจะให้ความรู้สึกเหมือนมองวัตถุที่ซ้อนกันอยู่ในสามมิติขึ้นมา ส่วนสีก็ให้อันที่อยู่ใกล้เป็นสีน้ำเงิน ที่อยู่ไกลสีแดง

ลองวาดใหม่ตามนี้
x = np.random.randn(1000)
y = np.random.randn(1000)
z = np.random.randn(1000) # ระยะแกน z ไม่ได้แสดงในภาพแต่ใช้เพื่อกำหนดขนาดและสี
s = 500/(z+4.5) # ขนาด ผกผันกับ z
c = np.vstack((0.5+z/10,0.3+z/20,0.5-z/10)).T # สีจากแม่สีทั้ง ๓ ที่เปลี่ยนค่าไปตาม z
plt.figure(figsize=[7,7])
plt.axes(xlim=[-4,4],ylim=[-4,4])
plt.scatter(x,y,alpha=0.15,marker='o',s=s,c=c,lw=2)
plt.show()





ลองนำแผนภาพการกระจายมาประกอบเข้ากับฮิสโทแกรมจะช่วยให้เห็นภาพรวมของการกระจายได้ดีขึ้น
x = np.random.randn(1000)-2
x[:500] += 4 # แยกตำแหน่งในแกน x ให้มีศูนย์กลาง ๒ ที่
y = np.random.randn(1000)
z = np.random.randn(1000)
s = 200/(z+4.5)
c = np.vstack((0.5+z/10,0.3+z/20,0.5-z/10)).T
ax1 = plt.subplot(221,xlim=[-6,6],ylim=[-4,4]) # แผนภาพหลัก
ax1.scatter(x,y,alpha=0.15,marker='o',s=s,c=c,lw=0)
ax1.xaxis.set_ticks_position('top') # ตั้งให้เลขบอกตำแหน่งอยู่ด้านบน
ax1.yaxis.set_ticks_position('left')
ax2 = plt.subplot(222,xlim=[0,60],ylim=[-4,4]) # ฮิสโทแกรมแกน y
ax2.hist(y,bins=50,orientation='horizontal')
ax2.xaxis.set_ticks_position('top')
ax2.yaxis.set_ticks_position('right')
ax3 = plt.subplot(223,xlim=[-6,6],ylim=[0,70]) # ฮิสโทแกรมแกน z
ax3.invert_yaxis() # พลิกกลับให้แท่งชี้ลง
ax3.hist(x,color='#AA22EE',bins=50)
ax3.xaxis.set_ticks_position('bottom')
ax3.yaxis.set_ticks_position('left')
plt.show()





อ้างอิง


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


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

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

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

หมวดหมู่

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

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

目次

日本による名言集
モジュール
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
機械学習
-- ニューラル
     ネットワーク
javascript
モンゴル語
言語学
maya
確率論
日本での日記
中国での日記
-- 北京での日記
-- 香港での日記
-- 澳門での日記
台灣での日記
北欧での日記
他の国での日記
qiita
その他の記事

記事の類別



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

  記事を検索

  おすすめの記事

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

ไทย

日本語

中文