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()
อ้างอิง