用alpha值绘制数据生成单色图像 - Matplotlib

2 投票
1 回答
1664 浏览
提问于 2025-04-18 16:24

我正在尝试绘制一些带有透明度值的数据。

如果不考虑透明度,我可以这样做:

plt.figure()
fig = plt.imshow(scalar_field, origin='lower', zorder=1, extent=(-4, 4, -4, 4))
plt.colorbar(fig)
plt.show()
plt.close()

这样就得到了这个图像:

在这里输入图像描述

但是我有一些透明度值需要包含进去。于是,我这样做:

plt.figure()
data = plt.cm.jet(scalar_field)
data[..., 3] = 1.0 # just for tests purposes
fig = plt.imshow(data, origin='lower', extent=(-4, 4, -4, 4))
plt.colorbar(fig)
plt.show()
plt.close()

在这里输入图像描述

这样是对的,因为 vmin=0.0vmax=1.0,而我的值太小了。

所以,为了能更好地看到一些东西,我这样做:

plt.figure()
data = plt.cm.jet(scalar_field)
data[..., 3] = 1.0 # just for tests purposes
max_lim = numpy.max(field_property)
min_lim = numpy.min(field_property)
fig = plt.imshow(data, origin='lower', extent=(-4, 4, -4, 4), vmin=min_lim, vmax=max_lim, cmap=plt.cm.jet))
plt.colorbar(fig)
plt.show()
plt.close()

这能正确调整图像的范围,就像第一幅图所显示的那样:

不过,我还是看不到图像。在这两种情况下,我只能看到图像里有一个奇怪的蓝色圆圈。

在这里输入图像描述

我漏掉了什么吗?

谢谢。

1 个回答

3

你需要明白的是,当你用某个值去调用 cmap 时,它是基于固定的值范围的。如果你传入一个 float(浮点数),那么 cmap 的范围是从 0 到 1。如果你传入一个 int(整数),那么范围是从 0 到 255。看起来你传入的值非常小,所以 cmap 返回的颜色接近于 0(比如说,蓝色对应于 jet 颜色图)。

然后你把这个“颜色数组”传给了 imshow,imshow 会把这个数组当作 RGB(A) 图像来显示。你添加的任何 vminvmaxcmap 的设置都会被忽略,因为它已经是一个 RGB 图像了,没什么可以映射的。

你想要做的是创建一个 ScalarMappable,这个可以通过一个 cmap 和一个 normalizer 来创建,后者用来设置范围。

由于你没有定义你的“标量字段”,我将使用一些来自 MPL Gallery 的示例数据:

import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np

# create the sample data
# after http://matplotlib.org/examples/images_contours_and_fields/pcolormesh_levels.html
dx, dy = 0.05, 0.05
y, x = np.mgrid[slice(1, 5 + dy, dy),
                slice(1, 5 + dx, dx)]

z = np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)


fig, ax = plt.subplots(figsize=(6,6))
ax.axis('off')

# with a normalizer you can set the range against which you want to map
norm = mpl.colors.Normalize(vmin=-1, vmax=1)
# the cmap of your choice
cmap = plt.cm.jet

# create a 'mapper'
mapper = mpl.cm.ScalarMappable(norm=norm, cmap=cmap)

# map the data to a rgba array
rgba = mapper.to_rgba(z)

# make some adjustments to the alpha
rgba[:,:,3] = 0.5

# and plot
# there is no need for vmin, cmap etc keywords, its already rgba
ax.imshow(rgba)

撰写回答