我正在使用imshow
绘制带有自定义色彩映射和boundarynorm的数组。但是,这将是一个自动脚本,我想保存imshow
生成的图像而不使用轴。所以我不确定imshow
是最好的方法,因为它将在后台运行。有没有其他选择我可以设置colormap和boundarynorm并生成一个我可以提供给imsave
的rgba数组?或者我只是留下了imshow
产生并保存的图像?
答案 0 :(得分:3)
您可以使用as_rgba_str
从图像中获取图像数据。这是一个例子:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2, 1000)
X, Y = np.meshgrid(x, x)
data = np.sin((X-2)**3 + Y**4)
im = plt.imshow(data)
x = im.make_image()
h, w, d = x.as_rgba_str()
n = np.fromstring(d, dtype=np.uint8).reshape(h, w, 4)
plt.figure()
plt.imshow(n[:,:,0], cmap="gray", origin='lower')
plt.show()
原始图片:
RGBA数据中的R通道(注意所有蓝色部分都是黑色的,因为它们中没有红色):
答案 1 :(得分:0)
matplotlib.colors.Colormap.__call__
执行cmap并返回RGBA数组。
https://matplotlib.org/3.3.1/api/_as_gen/matplotlib.colors.Colormap.html#matplotlib.colors.Colormap.__call__
# created using numpy 1.18.5 and matplotlib 3.2.2
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm, colors
x = np.linspace(0, 2, 1000)
X, Y = np.meshgrid(x, x)
data = np.sin((X-2)**3 + Y**4)
print(f"data.shape: {data.shape}")
print(f"data.dtype: {data.dtype}")
cmap: colors.Colormap = cm.get_cmap("rainbow")
norm: colors.Normalize = colors.Normalize()
# set min and max values from data
norm.autoscale(data)
# move scalar values to range [0, 1]
# can skip and pass directly to cmap if data already [0, 1]
normalised = norm(data)
# create a RBGA array
# bytes=True gives a uint8 array (Unsigned integer 0 to 255)
data_rgba = cmap(normalised, bytes=True)
print(f"data_rgba.shape: {data_rgba.shape}")
print(f"data_rgba.dtype: {data_rgba.dtype}")
# pass RBGA array to imsave and set origin to upper or lower
plt.imsave("my_data.png", data_rgba, origin="lower")
使用matplotlib.cm.ScalarMappable.to_rgba
也可以一步完成,但我还没有尝试过。
https://matplotlib.org/3.3.1/api/cm_api.html#matplotlib.cm.ScalarMappable.to_rgba