Matplotlib imshow () grafik eksenindeki değerleri değiştirme


90

Bazı giriş verilerim olduğunu varsayalım:

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))

Bunu kullanarak grafiğini çizebilirim imshow():

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

alma:

görüntü açıklamasını buraya girin

Ancak, x ekseni değerleri giriş verileriyle eşleşmez (yani ortalama 100, 80 ila 122 aralığı). Bu nedenle, değerleri göstermek için x eksenini değiştirmek istiyorum edges.

Denedim:

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

ve

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

görüntü açıklamasını buraya girin

Eksen değerlerini, kullandığım giriş verilerini yansıtacak şekilde nasıl değiştirebileceğime dair bir fikriniz var mı?


Bu cevapta belirtildiği gibi pcoloryerine kullanın . imshow
Nirmal

Yanıtlar:


144

xticklabelsMümkünse değiştirmekten kaçınmaya çalışırdım , aksi takdirde örneğin histogramınızı ek verilerle fazla çizerseniz çok kafa karıştırıcı olabilir.

Şebekenizin aralığını tanımlamak muhtemelen en iyisidir ve bununla anahtar kelime imshowekleyerek yapılabilir extent. Bu şekilde eksenler otomatik olarak ayarlanır. Etiketleri değiştirmek isterseniz set_xticks, belki bir formatlayıcı ile kullanırım . Etiketleri doğrudan değiştirmek son çare olmalıdır.

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

görüntü açıklamasını buraya girin


18
interpolation="none"Gerçek verilerin çok daha doğru bir temsilinin burada kullanıldığını da belirtmek gerekir .
Hooked

4
Çok faydalı bir cevap; Bunu iki değişkenli (yani sismik veriler) bir fonksiyonun renk grafiğini yapmak için kullandım. Ayrıca sismik ekranı 'uzatıp sıkıştırabilmem için' imshow () 'a "en-boy =' otomatik '" seçeneğini de ekledim.
Kurt Peek

11

Benzer bir sorun yaşadım ve google beni bu yazıya gönderiyordu. Benim çözümüm biraz farklı ve daha az kompakttı, ancak umarım bu biri için yararlı olabilir.

Görselinizi matplotlib.pyplot.imshow ile göstermek, genellikle 2D verileri görüntülemenin hızlı bir yoludur. Ancak bu, varsayılan olarak eksenleri piksel sayısıyla etiketler. Çizdiğiniz 2D veriler, x ve y dizileri tarafından tanımlanan tek tip bir ızgaraya karşılık geliyorsa, bu dizilerdeki değerleri kullanarak x ve y eksenlerini etiketlemek için matplotlib.pyplot.xticks ve matplotlib.pyplot.yticks kullanabilirsiniz. Bunlar, gerçek ızgara verilerine karşılık gelen bazı etiketleri eksenler üzerindeki piksel sayılarıyla ilişkilendirir. Ve bunu yapmak, örneğin pcolor gibi bir şey kullanmaktan çok daha hızlıdır.

İşte verilerinizle buna bir deneme:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.