2015-12-24 6 views
5

Chciałbym wykreślić wykres na tle obrazu za pomocą matplotlib. Znalazłem jak to zrobić w Matlab http://www.peteryu.ca/tutorials/matlab/plot_over_image_backgroundDrukuj na tle obrazu w pythoniu

Próbowałem coś takiego: podstawowa

im = plt.imread("dd.png") 
implot = plt.imshow(im) 
theta=np.linspace(0,2*np.pi,50) 
z=np.cos(theta)*39+145 
t=np.sin(theta)*39+535-78+39 
plt.plot(z,t) 
plt.show() 

ale to dało mi coś naprawdę brzydkiego:

something really ugly

+2

'imshow' może przyjmować o wiele więcej argumentów, które pozwalają określić położenie obrazu i jego zakres w przestrzeni współrzędnych. Domyślnie lewy górny róg jest ustawiony na (0, 0), a każdy piksel to 1x1 jednostek szerokości i wysokości. –

Odpowiedz

17

podobnie jak w Przykład MATLAB, z którym się łączyłeś, musisz określić wymagany rozmiar obrazu, gdy zadzwonisz pod numer imshow.

Domyślnie matplotlib i MATLAB umieszczają lewy górny róg obrazu, początek, dół i na prawo stamtąd, i ustawia każdy piksel jako kwadrat 1x1 w przestrzeni współrzędnych. Oto, co robi twój wizerunek. Można to kontrolować za pomocą parametru , który ma postać listy [left, right, bottom, top].

Nie stosując zakres wygląda następująco:

import matplotlib.pyplot as plt 
img = plt.imread("airlines.jpg") 
fig, ax = plt.subplots() 
ax.imshow(img) 

enter image description here

Widać, że mamy 1600 x 1200 z Samuelem L. Jacksonem się, szczerze mówiąc, raczej zirytowany z wężem na pokładzie jego lot lotniczy.

Ale jeśli chcemy wykreślić linię w zakresie od 0 do 300 zarówno w wymiarze ponad to, co możemy zrobić, tylko że:

fig, ax = plt.subplots() 
x = range(300) 
ax.imshow(img, extent=[0, 400, 0, 300]) 
ax.plot(x, x, '--', linewidth=5, color='firebrick') 

enter image description here

nie wiem, czy linia pomóż Panu Jacksonowi w jego problemie z wężem. Przynajmniej nie sprawi, że sprawy będą trudniejsze.