2012-07-15 14 views
12

jestem generowanie tablic 2D na osiach dziennika rozstawione (na przykład współrzędne x pikseli są generowane przy użyciu logspace(log10(0.95), log10(2.08), n).nieliniowe osie imshow w matplotlib

chcę wyświetlić obraz za pomocą zwykłego starych imshow, w natywnej rozdzielczości i skalowaniu (nie potrzebuję to stretch it, same dane są już skalowane), ale chcę dodać tiki, etykiety, linie, które są we właściwym miejscu na osiach dziennika. Jak to zrobić?

Idealnie mógłbym użyć linii poleceń axvline(1.5), a linia byłaby we właściwym miejscu (58% od lewej), ale jeśli jedynym sposobem jest ręczne przetłumaczenie współrzędnych logscale i obrazu c oordinate, to też jest ok.

Dla osi liniowych, przy użyciu extents= w wywołaniu imshow robi to, co chcę, ale nie widzę sposobu, aby zrobić to samo z osi dziennika.

Przykład:

from matplotlib.colors import LogNorm 

x = logspace(log10(10), log10(1000), 5) 
imshow(vstack((x,x)), extent=[10, 1000, 0, 100], cmap='gray', norm=LogNorm(), interpolation='nearest') 
axvline(100, color='red') 

Przykład ten nie działa, ponieważ stopniu = stosuje się tylko do skal liniowych, więc kiedy robisz axvline na 100, to nie pojawia się w środku. Chciałbym, aby oś X pokazywała 10, 100, 1000 i axvline(100), aby umieścić linię pośrodku w punkcie 100, a piksele pozostają równomiernie rozmieszczone.

+0

Czy masz jakiś działający kod lub obraz tego, co chcesz osiągnąć. Kolejne pytanie brzmi, czy jesteś elastyczny w używaniu pcolor zamiast imshow. – imsc

+0

@imsc: dodano przykład. Myślę, że pcolor jest w porządku. – endolith

Odpowiedz

7

Właściwie działa poprawnie. Jestem zmieszany.

Wcześniej otrzymywałem błędy o "Obrazy nie są obsługiwane na osiach nieliniowych", dlatego zadałem to pytanie. Ale teraz, gdy próbuję go, to działa:

import matplotlib.pyplot as plt 
import numpy as np 

x = np.logspace(1, 3, 5) 
y = np.linspace(0, 2, 3) 
z = np.linspace(0, 1, 4) 
Z = np.vstack((z, z)) 

plt.imshow(Z, extent=[10, 1000, 0, 1], cmap='gray') 
plt.xscale('log') 

plt.axvline(100, color='red') 

plt.show() 

To jest lepsze niż pcolor() i pcolormesh() ponieważ

  1. to nie jest szalenie powolny i
  2. jest interpolowana ładnie bez mylące artefaktów, gdy obraz nie jest wyświetlane w rozdzielczości macierzystej.
+2

Jestem równie zdezorientowany. Poprzednio próbowałem 'imshow' z' log' i to nie działało, jednak działa teraz idealnie. – imsc

+2

Stwierdziliśmy, że jeśli usuniesz 'extent', to nie zadziała. To znaczy, 'plt.imshow (Z, cmap = 'grey'); plt.xscale ('log') 'podnosi błąd. – Developer

+1

@ programista, może dlatego, że domyślny zakres zaczyna się od 0? – endolith

10

Moim zdaniem lepiej jest używać wartości pcolor i zwykłych (niezmodyfikowanych) wartości xiy. pcolor zapewnia większą elastyczność, a regularne osie x i y są mniej kłopotliwe.

import pylab as plt 
import numpy as np 
from matplotlib.colors import LogNorm 
from matplotlib.ticker import LogFormatterMathtext 

x=np.logspace(1, 3, 6) 
y=np.logspace(0, 2,3) 
X,Y=np.meshgrid(x,y) 
z = np.logspace(np.log10(10), np.log10(1000), 5) 
Z=np.vstack((z,z)) 

im = plt.pcolor(X,Y,Z, cmap='gray', norm=LogNorm()) 
plt.axvline(100, color='red') 

plt.xscale('log') 
plt.yscale('log') 

plt.colorbar(im, orientation='horizontal',format=LogFormatterMathtext()) 
plt.show() 

enter image description here

Jak pcolor jest powolny, szybsze rozwiązaniem jest użycie pcolormesh zamiast.

im = plt.pcolormesh(X,Y,Z, cmap='gray', norm=LogNorm()) 
+0

Wygląda na to, że rozwiąże to mój problem. Oto prostszy przykład, który dostaje się do tego, co próbowałem rozwiązać: https://gist.github.com/3124528 Więc pcolor jest jak bardzo powolny obraz, który rysuje każdy piksel jako prostokąt? Nie da się zrobić 'xscale ('log')' with imshow? – endolith

+0

'pcolormesh' wygląda jak szybszy sposób na zrobienie tego samego. "pcolormesh używa QuadMesh, szybszego uogólniania pcolor, ale z pewnymi ograniczeniami." Nie jestem pewien, jakie są ograniczenia, ale wydaje się, że działa. – endolith

+0

'pcolormesh' wydaje się być dobrą alternatywą. Jednym z ograniczeń jest to, że nie można go używać z maskowanymi układami współrzędnych. – imsc

Powiązane problemy