我正在尝试使用不透明度值绘制某些数据。
为了在没有不透明度的情况下绘制它,我可以这样做:
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.0
和vmax=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()
正确调整图像限制,如第一张图所示:
然而,我还看不到图像。在这两种情况下,我都能在图像中看到类似奇怪的蓝色圆圈的东西。
我错过了什么?
谢谢。
答案 0 :(得分:3)
您缺少的是,使用某个值调用cmap
会假定固定值。如果传递float
,则cmap的范围固定在0和1之间。如果传递int
,则范围为0到255.显然,您将非常小的值传递给{ {1}}然后返回等于或接近值0的颜色(因此喷射为蓝色)。
然后你传递这个颜色阵列'为了表示,这假设并将数组显示为RGB(A)图像。您添加的任何cmap
,vmin
和vmax
内容都会被忽略,因为它已经是RGB图像,没有任何地方可以映射。
您要创建的是cmap
,您可以使用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)