กระจายพล็อตและการแมปสีใน Python


92

ฉันมีช่วงของจุด x และ y ที่เก็บไว้ในอาร์เรย์จำนวนนับ สิ่งเหล่านี้แสดงถึง x (t) และ y (t) โดยที่ t = 0 ... T-1

ฉันกำลังวางพล็อตกระจายโดยใช้

import matplotlib.pyplot as plt

plt.scatter(x,y)
plt.show()

ฉันต้องการมี colormap แทนเวลา (ดังนั้นการระบายสีจุดขึ้นอยู่กับดัชนีในอาร์เรย์จำนวนนับ)

วิธีที่ง่ายที่สุดคืออะไร?

คำตอบ:


175

นี่คือตัวอย่าง

import numpy as np
import matplotlib.pyplot as plt

x = np.random.rand(100)
y = np.random.rand(100)
t = np.arange(100)

plt.scatter(x, y, c=t)
plt.show()

ที่นี่คุณจะตั้งค่าสีบนพื้นฐานของดัชนีซึ่งเป็นเพียงอาร์เรย์ของ t[1, 2, ..., 100]ป้อนคำอธิบายภาพที่นี่

บางทีตัวอย่างที่เข้าใจง่ายกว่านั้นอาจจะง่ายกว่าเล็กน้อย

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = x
t = x
plt.scatter(x, y, c=t)
plt.show()

ป้อนคำอธิบายภาพที่นี่

โปรดทราบว่าอาร์เรย์ที่คุณส่งผ่านcไม่จำเป็นต้องมีลำดับหรือประเภทใด ๆ โดยเฉพาะกล่าวคือไม่จำเป็นต้องเรียงลำดับหรือจำนวนเต็มเหมือนในตัวอย่างเหล่านี้ รูทีนการพล็อตจะปรับขนาด Colormap เพื่อให้ค่าต่ำสุด / สูงสุดcสอดคล้องกับด้านล่าง / ด้านบนของ colormap

Colormaps

คุณสามารถเปลี่ยน colormap ได้โดยเพิ่ม

import matplotlib.cm as cm
plt.scatter(x, y, c=t, cmap=cm.cmap_name)

การนำเข้าmatplotlib.cmเป็นทางเลือกเนื่องจากคุณสามารถเรียก colormaps ได้cmap="cmap_name"เช่นกัน มีหน้าอ้างอิงของ colormaps ที่แสดงให้เห็นว่าแต่ละส่วนมีลักษณะอย่างไร โปรดทราบด้วยว่าคุณสามารถย้อนกลับ colormap ได้โดยเรียกมันว่าcmap_name_r. อย่างใดอย่างหนึ่ง

plt.scatter(x, y, c=t, cmap=cm.cmap_name_r)
# or
plt.scatter(x, y, c=t, cmap="cmap_name_r")

จะทำงาน. ตัวอย่างคือ"jet_r"หรือcm.plasma_r. นี่คือตัวอย่างของ viridis 1.5 colormap ใหม่:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = x
t = x
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.scatter(x, y, c=t, cmap='viridis')
ax2.scatter(x, y, c=t, cmap='viridis_r')
plt.show()

ป้อนคำอธิบายภาพที่นี่

แถบสี

คุณสามารถเพิ่มแถบสีได้โดยใช้

plt.scatter(x, y, c=t, cmap='viridis')
plt.colorbar()
plt.show()

ป้อนคำอธิบายภาพที่นี่

โปรดทราบว่าหากคุณใช้ตัวเลขและพล็อตย่อยอย่างชัดเจน (เช่นfig, ax = plt.subplots()หรือax = fig.add_subplot(111)) การเพิ่มแถบสีอาจมีส่วนเกี่ยวข้องมากขึ้นเล็กน้อย ตัวอย่างที่ดีสามารถพบได้ที่นี่สำหรับแถบสีจุดย่อยเดียวและที่นี่สำหรับ 2 จุดย่อย 1 แถบสี


1
คุณสามารถรับตำนานสำหรับสีด้วยplt.colorbar()คำสั่ง
drevicko

ดูเหมือนว่ารหัสจะมีการเปลี่ยนแปลงที่นี่ cmap = cm.colormap_name ควรเป็น cmap = cm.cmapname
คริส

@ cmarti1138 ผมไม่แน่ใจว่าสิ่งที่คุณหมายถึงcm.colormap_nameและcm.cmapnameไม่ได้เกิดขึ้นจริงในตัวแปรmatplotlib.cm; เป็นเพียงรหัสเทียมสำหรับcm.jetหรือcm.veridis_rฯลฯ
wflynny

c=np.arange(len(x))องค์ประกอบหลักในคำตอบนี้อยู่
Guimoute

10

หากต้องการเพิ่มคำตอบของ wflynny ด้านบนคุณสามารถค้นหา colormaps ที่มีอยู่ได้ที่นี่

ตัวอย่าง:

import matplotlib.cm as cm
plt.scatter(x, y, c=t, cmap=cm.jet)

หรืออีกทางหนึ่ง

plt.scatter(x, y, c=t, cmap='jet')

4

Subplot Colorbar

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

จากตัวอย่างข้างต้น:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
y = x
t = x
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.scatter(x, y, c=t, cmap='viridis')
ax2.scatter(x, y, c=t, cmap='viridis_r')


# Build your secondary mirror axes:
fig2, (ax3, ax4) = plt.subplots(1, 2)

# Build maps that parallel the color-coded data
# NOTE 1: imshow requires a 2-D array as input
# NOTE 2: You must use the same cmap tag as above for it match
map1 = ax3.imshow(np.stack([t, t]),cmap='viridis')
map2 = ax4.imshow(np.stack([t, t]),cmap='viridis_r')

# Add your maps onto your original figure/axes
fig.colorbar(map1, ax=ax1)
fig.colorbar(map2, ax=ax2)
plt.show()

กระจายพล็อตย่อยด้วย COLORBAR

โปรดทราบว่าคุณจะส่งออกตัวเลขรองที่คุณสามารถเพิกเฉยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.