[英]How to use 'xdata' in imshow() from MatLab in Python3 imshow()
我正在嘗試將一些 MatLab 代碼轉換為 Python3,但在一行中遇到問題,MatLab 中的這一行是
imshow(sqrt(I),[0,100],'InitialMagnification','fit','xdata',[-1,1]*a,'ydata',[-1,1]*a);
其中a
是某個常數。
我遇到的問題是'XData'
和'YData'
。 我目前正在使用 Python 代碼
matplotlib.pyplot.imshow(np.sqrt(np.real(I)), vmin = 0, vmax = 100)
如何將'XData'
和'YData'
元素轉換為 Python?
編輯 Python 和 MatLab 的完整代碼
蟒蛇代碼:
(我很抱歉,但我還沒有評論這段代碼,如果需要我可以這樣做)
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()
蟒蛇圖像:
MatLab 代碼
% 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 圖像(圖像應該是什么樣子)
沿非默認空間坐標系的 X 軸的限制,指定為二元素向量
(類似於YData
和 y 軸)。 對於matplotlib.pyplot.imshow
, extent
參數似乎具有相同的效果:
范圍:標量(左、右、下、上),可選,默認值:
None
數據坐標中左下角和右上角的位置。 如果
None
,圖像的位置使得像素中心落在基於零的(行、列)索引上。
因此等效的調用將是
matplotlib.pyplot.imshow(np.sqrt(np.real(I)), vmin = 0, vmax = 100, extent=(-a, a, -a, a))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.