เปลี่ยนค่าบนแกนกราฟ matplotlib imshow ()


90

สมมติว่าฉันมีข้อมูลอินพุต:

data = np.random.normal(loc=100,scale=10,size=(500,1,32))
hist = np.ones((32,20)) # initialise hist
for z in range(32):
    hist[z],edges = np.histogram(data[:,0,z],bins=np.arange(80,122,2))

ฉันสามารถวางแผนโดยใช้imshow():

plt.imshow(hist,cmap='Reds')

รับ:

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

อย่างไรก็ตามค่าแกน x ไม่ตรงกับข้อมูลอินพุต (เช่นค่าเฉลี่ย 100 ช่วง 80 ถึง 122) ดังนั้นฉันต้องการเปลี่ยนแกน x เพื่อแสดงค่าในรูปแบบedges.

ฉันเหนื่อย:

ax = plt.gca()
ax.set_xlabel([80,122]) # range of values in edges
...
# this shifts the plot so that nothing is visible

และ

ax.set_xticklabels(edges)
...
# this labels the axis but does not centre around the mean:

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

มีแนวคิดเกี่ยวกับวิธีเปลี่ยนค่าแกนเพื่อให้สอดคล้องกับข้อมูลอินพุตที่ฉันใช้อยู่หรือไม่


ใช้pcolorแทนimshowตามที่กล่าวไว้ในคำตอบนี้
Nirmal

คำตอบ:


144

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

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

fig, ax = plt.subplots(figsize=(6,6))

ax.imshow(hist, cmap=plt.cm.Reds, interpolation='none', extent=[80,120,32,0])
ax.set_aspect(2) # you may also use am.imshow(..., aspect="auto") to restore the aspect ratio

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


18
นอกจากนี้ยังเป็นที่น่าสังเกตว่าinterpolation="none"มีการใช้ที่นี่ซึ่งเป็นการแสดงข้อมูลจริงที่แม่นยำกว่ามาก
ติดยาเสพติด

4
คำตอบที่มีประโยชน์ที่สุด ฉันเคยใช้มันเพื่อสร้างพล็อตสีของฟังก์ชันของสองตัวแปร (คือข้อมูลแผ่นดินไหว) ฉันยังเพิ่มตัวเลือก "ด้าน = 'อัตโนมัติ'" ใน imshow () เพื่อให้ฉันสามารถ 'ยืดและบีบ' การแสดงแผ่นดินไหวได้
Kurt Peek

11

ฉันมีปัญหาที่คล้ายกันและ Google ก็ส่งฉันไปที่โพสต์นี้ วิธีแก้ปัญหาของฉันแตกต่างไปเล็กน้อยและมีขนาดกะทัดรัดน้อยลง แต่หวังว่าจะเป็นประโยชน์กับใครบางคน

การแสดงภาพของคุณด้วย matplotlib.pyplot.imshow โดยทั่วไปเป็นวิธีที่รวดเร็วในการแสดงข้อมูล 2 มิติ อย่างไรก็ตามโดยค่าเริ่มต้นจะติดป้ายกำกับแกนด้วยจำนวนพิกเซล หากข้อมูล 2 มิติที่คุณกำลังพล็อตสอดคล้องกับกริดสม่ำเสมอที่กำหนดโดยอาร์เรย์ x และ y คุณสามารถใช้ matplotlib.pyplot.xticks และ matplotlib.pyplot.yticks เพื่อติดป้ายกำกับแกน x และ y โดยใช้ค่าในอาร์เรย์เหล่านั้น สิ่งเหล่านี้จะเชื่อมโยงป้ายกำกับบางส่วนที่สอดคล้องกับข้อมูลกริดจริงกับจำนวนพิกเซลบนแกน และการทำสิ่งนี้เร็วกว่าการใช้ pcolor เป็นอย่างมาก

นี่คือความพยายามกับข้อมูลของคุณ:

import matplotlib.pyplot as plt

# ... define 2D array hist as you did

plt.imshow(hist, cmap='Reds')
x = np.arange(80,122,2) # the grid to which your data corresponds
nx = x.shape[0]
no_labels = 7 # how many labels to see on axis x
step_x = int(nx / (no_labels - 1)) # step between consecutive labels
x_positions = np.arange(0,nx,step_x) # pixel count at label position
x_labels = x[::step_x] # labels you want to see
plt.xticks(x_positions, x_labels)
# in principle you can do the same for y, but it is not necessary in your case
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.