简体   繁体   中英

How to use 'xdata' in imshow() from MatLab in Python3 imshow()

I'm trying to convert some MatLab code to Python3 but am having trouble with one line, the line in MatLab is

imshow(sqrt(I),[0,100],'InitialMagnification','fit','xdata',[-1,1]*a,'ydata',[-1,1]*a);

Where a is some constant.

The problems I'm having are with 'XData' and 'YData' . I'm currently using the Python code

matplotlib.pyplot.imshow(np.sqrt(np.real(I)), vmin = 0, vmax = 100)

How do I convert the 'XData' and 'YData' elements into Python?

EDIT Full Code for Python and MatLab

Python code:

(I'm sooo sorry, but I haven't commented this code yet, I can do so if needed)

import numpy as np
import matplotlib.pyplot as plt

plt.close("all")

l = 633*10**(-6)
L = 10

N = 2**11
Nx = 2**11
Ny = 2**11

xmax = 5*10**(-4)
ymax = 5*10**(-4)
curlyv = np.zeros((Nx,Ny),dtype=np.double)
x = np.tile(np.linspace(-xmax,xmax,Nx),(Ny,1))
y = np.tile(np.linspace(-ymax,ymax,Ny).reshape(Ny,1),(1,Nx))
h = np.sqrt(4*np.pi/(l*L))

np_x = np.array(x)
np_y = np.array(y)

aperture = np.sqrt(np_x**2 + np_y**2) >= 100*10**-6

curlyv[aperture] = 1    

vprime = np.fft.fftshift(np.fft.fft2(curlyv))
I = vprime*np.conj(vprime)
Imax = np.real(np.amax(I))
fig2 = plt.figure()
Imax_b = Imax/5000
pltp = plt.imshow(np.sqrt(np.real(I)), vmin = 0, vmax = 100, cmap='Greys_r', extent=(-Nx/h*1000, Nx/h*1000, -Ny/h*1000, Ny/h*1000))

plt.show()

Python image:

蟒蛇图像

MatLab Code

% This script calculates, via a 2D Fourier Transform, the Fraunhofer diffraction
% pattern due to a circular aperture. Source plane is the xy-plane. The field plane
% is at a distance L from the source plane.

lambda = 633e-6; L = 10;                     % meters

% Set up the source plane domain and initialize the source plane amplitude (curlyv) at each point
N=2^11; Nx = N; Ny = N;                         % resolution (pixels)
xmax=5e-4;                                  % meters
ymax=5e-4;                                  % meters
curlyv = zeros(Nx,Ny);                      % curlyv has one complex value at each location (x,y)
x=repmat(linspace(-xmax,xmax,Nx),Ny,1);     % x domain (source plane)
y=repmat(linspace(-ymax,ymax,Ny)',1,Nx);    % y domain (source plane)
h = sqrt(4*pi/(lambda*L));                  % axes scaling (from the theory)

% construct a logical vector corresponding to the (x,y)-locations where the incident field is
% non-zero. Only need to set these elements of curlyv so some non-zero values
% corresponding to the incident field's complex amplitude.

aperture = sqrt(x.^2+y.^2) >= 100e-6;       % logical vector giving aperture shape
% The incident field ampli0tude u(x,y) is just 1 everywhere in the aperture. The additional
% exponential corresponding to the phase in curlyv is formally required from the theory but can be omitted to a good
% approximation in most cases.
curlyv(aperture)=1;                         %exp(1i*h^2*(x(aperture).^2+y(aperture).^2));

figure(1);
iptsetpref('ImShowAxesVisible','On');
imshow(curlyv,[-0.5 1],'InitialMagnification','fit',...
    'xdata',[-xmax, xmax]*1000,'ydata',[-ymax,ymax]*1000); % display the diffraction pattern
vprime = fftshift(fft2(curlyv,Nx,Nx));      % perform the 2D FT to get the field plane field amplitude
I = conj(vprime).*vprime;                   % calculate intensity
xlabel('mm'); ylabel('mm');

figure(2);
Imax=max(max(I));
iptsetpref('ImShowAxesVisible','On');
imshow(sqrt(I),[0,sqrt(Imax)/50],'InitialMagnification','fit','xdata',[-1,1]*Nx/h*1000,'ydata',[-1,1]*Ny/h*1000); % display the diffraction pattern

colormap(bone); shg;  shading interp;
axis([-2,2,-2,2]*1000);       % 0 =  black, Imax/10 = white (so many pixels will be saturated)
xlabel('mm'); ylabel('mm');

MatLab Image (what the images should look like)

在此处输入图片说明

XData for imshow in MATLAB sets the

Limits along X axis of a nondefault spatial coordinate system, specified as a two-element vector

(similar for YData and the y axis). For matplotlib.pyplot.imshow , the extent parameter seems to have the same effect:

extent : scalars (left, right, bottom, top), optional, default: None

The location, in data-coordinates, of the lower-left and upper-right corners. If None , the image is positioned such that the pixel centers fall on zero-based (row, column) indices.

Hence the equivalent call would be

matplotlib.pyplot.imshow(np.sqrt(np.real(I)), vmin = 0, vmax = 100, extent=(-a, a, -a, a))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM