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के रूप में इस में वर्णित जवाब
निर्मल 7

जवाबों:


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 () में "पहलू = 'ऑटो' विकल्प भी जोड़ा ताकि मैं भूकंपीय प्रदर्शन को 'खिंचाव और निचोड़' सकूं।
कर्ट पीक

11

मुझे इसी तरह की समस्या थी और Google मुझे इस पोस्ट पर भेज रहा था। मेरा समाधान थोड़ा अलग और कम कॉम्पैक्ट था, लेकिन उम्मीद है कि यह किसी के लिए उपयोगी हो सकता है।

Matplotlib.pyplot.imshow के साथ अपनी छवि दिखाना आमतौर पर 2D डेटा प्रदर्शित करने का एक तेज़ तरीका है। हालाँकि यह डिफ़ॉल्ट रूप से पिक्सेल गणना के साथ कुल्हाड़ियों को लेबल करता है। यदि आप जिस 2D डेटा की साजिश रच रहे हैं, वह सरणियों x और y द्वारा परिभाषित कुछ समान ग्रिड से मेल खाता है, तो आप उन सरणियों में मानों का उपयोग करके x और y अक्षतंतु को लेबल करने के लिए matplotlib.pyplot.xticks और matplotlib.pyplot.yticks का उपयोग कर सकते हैं। ये कुल्हाड़ियों पर पिक्सेल की गिनती के लिए वास्तविक ग्रिड डेटा के अनुरूप कुछ लेबल को जोड़ देगा। और ऐसा करना उदाहरण के लिए 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.