如何在MATLAB中重新创建基本的plt.imshow(x)
?imshow
和imagesc
不能处理任意浮点数据。
最低限度,vmin
和vmax
(颜色标准范围)也应该被复制。可选地,我希望能够使用一些MATLAB中没有的Python颜色Map表,特别是'bwr'
-这可行吗?
下面是一个小例子。
import numpy as np
from numpy.fft import ifft, ifftshift
import matplotlib.pyplot as plt
# generate `x`
N, M = 2048, 512
wx, wy = np.linspace(0, 1, N, 0), np.linspace(0, 1, M, 0)
psi_x = ifftshift(ifft(np.exp(-(wx - .0125/2 )**2 * 2**19)))
psi_y = ifftshift(ifft(np.exp(-(wy - .00625*2)**2 * 2**16)))
x = psi_x * psi_y[:, None]
# make reusables
title_kw = dict(loc='left', weight='bold', fontsize=22)
mx = np.max(np.abs(x))
# plot
plt.imshow(x.real, cmap='bwr', vmin=-mx, vmax=mx, aspect='auto')
plt.title("Real part", **title_kw)
plt.gcf().set_size_inches((8, 8))
plt.show()
plt.imshow(abs(x), cmap='turbo', vmin=0, vmax=mx, aspect='auto')
plt.title('Absolute value', **title_kw)
plt.gcf().set_size_inches((8, 8))
plt.show()
1条答案
按热度按时间vtwuwzda1#
下面的
imshow
完全重现了这个例子。将
x
缩放到[-255, 255]
内并转换为int32
使其适合imagesc
。剩下的就是挖掘各种MATLAB文档的问题了:vmin
、vmax
通过axis.CLim再现。figsize
是通过操作figure.Position来再现的。set_size_inches
-通过Python中的fig.dpi * figsize
将Python的英寸转换为像素(我还没有完全测试过);还有figure.Units = 'inches'
,但这也会影响图形的位置plt.title
用title复制cmap
是通过使用colormap来复制的。不支持的颜色Map表可以从Python中移植,如下面的示例所示。set(ax, 'YDir', 'reverse')
以匹配Python从上到下不断增加的垂直索引。imagesc
在默认情况下并不总是这样做,即使没有指定'CData'
(可能是一个bug,尽管下面的代码中没有;我在别处获取fig
,ax
)fig
,ax
(例如,子图),可能更适合执行imagesc(ax, 'CData', x)
,但请参阅高级与低级注解示例重现
移植色彩Map表
请参见this Q&A。
imshow
什么是情节?2D separable Morlet wavelet