在 matplotlib 中使用 contourf 将特定值映射到颜色
Mapping certain value to a color using contourf in matplotlib
几天来我一直在尝试解决这个问题,但是 none 我在网上找到的解决方案似乎对我来说非常有效,尽管这个问题看起来很简单。
import numpy as np
from matplotlib import pyplot as plt
grid_x = np.linspace(-5, 5, 500)
grid_y = np.linspace(-5, 5, 500)
xx, yy = np.meshgrid(grid_x, grid_y)
fig, ax = plt.subplots(2)
rand1 = np.ones((500,500))
rand1[:, 250:] = 2
ax[0].contourf(xx, yy, rand1, alpha=.3, cmap = 'jet')
rand2 = np.zeros((500,500))
rand2[:, 200:250] = 1
rand2[:,250:] = 2
ax[1].contourf(xx, yy, rand2, alpha=.3, cmap = 'jet')
这是上面 运行 的结果图:
在第一个轴上,1 映射到蓝色,2 映射到红色。
在第二个轴上,0 映射到蓝色,1 映射到绿色,2 映射到红色。
我希望它是一致的,例如,1 总是映射到蓝色,2 总是映射到红色,0 总是映射到绿色。
据我所知,这个问题可以通过确保两个图的值都在 (0,1,2) 中全部显示在某个点来解决,但是我无法确保我的项目如此,因此不是有效的解决方案。
我的另一个想法是分别绘制每个区域的地图。但是,我不确定该怎么做,虽然我认为上面的简单示例相对容易,但我需要它泛化到任意形状的子区域。
有人对如何解决这个问题有建议吗?非常感谢!
为了更好地查看正在发生的情况,添加颜色栏会有所帮助。它显示了使用的级别和相应的颜色。
要使相应级别的颜色相同,绘图之间的级别应该相同:
import numpy as np
from matplotlib import pyplot as plt
grid_x = np.linspace(-5, 5, 500)
grid_y = np.linspace(-5, 5, 500)
xx, yy = np.meshgrid(grid_x, grid_y)
rand1 = np.ones((500, 500))
rand1[:, 250:] = 2
rand2 = np.zeros((500, 500))
rand2[:, 200:250] = 1
rand2[:, 250:] = 2
# common_levels = np.linspace(0, 2, 11)
common_levels = np.linspace(min(rand1.min(), rand2.min()), max(rand1.max(), rand2.max()), 11)
fig, axs = plt.subplots(ncols=2, nrows=2, figsize=(12, 6))
contour00 = axs[0, 0].contourf(xx, yy, rand1, alpha=.3, cmap='jet')
axs[0, 0].set_title('values 1 and 2, default levels')
plt.colorbar(contour00, ax=axs[0, 0])
contour01 = axs[0, 1].contourf(xx, yy, rand1, levels=common_levels, alpha=.3, cmap='jet')
plt.colorbar(contour01, ax=axs[0, 1])
axs[0, 1].set_title('values 1 and 2, common levels')
contour10 = axs[1, 0].contourf(xx, yy, rand2, alpha=.3, cmap='jet')
axs[1, 0].set_title('values 0, 1 and 2, default levels')
plt.colorbar(contour10, ax=axs[1, 0])
contour11 = axs[1, 1].contourf(xx, yy, rand2, levels=common_levels, alpha=.3, cmap='jet')
axs[1, 1].set_title('values 0, 1 and 2, common levels')
plt.colorbar(contour11, ax=axs[1, 1])
plt.tight_layout()
plt.show()
几天来我一直在尝试解决这个问题,但是 none 我在网上找到的解决方案似乎对我来说非常有效,尽管这个问题看起来很简单。
import numpy as np
from matplotlib import pyplot as plt
grid_x = np.linspace(-5, 5, 500)
grid_y = np.linspace(-5, 5, 500)
xx, yy = np.meshgrid(grid_x, grid_y)
fig, ax = plt.subplots(2)
rand1 = np.ones((500,500))
rand1[:, 250:] = 2
ax[0].contourf(xx, yy, rand1, alpha=.3, cmap = 'jet')
rand2 = np.zeros((500,500))
rand2[:, 200:250] = 1
rand2[:,250:] = 2
ax[1].contourf(xx, yy, rand2, alpha=.3, cmap = 'jet')
这是上面 运行 的结果图:
在第一个轴上,1 映射到蓝色,2 映射到红色。 在第二个轴上,0 映射到蓝色,1 映射到绿色,2 映射到红色。
我希望它是一致的,例如,1 总是映射到蓝色,2 总是映射到红色,0 总是映射到绿色。
据我所知,这个问题可以通过确保两个图的值都在 (0,1,2) 中全部显示在某个点来解决,但是我无法确保我的项目如此,因此不是有效的解决方案。
我的另一个想法是分别绘制每个区域的地图。但是,我不确定该怎么做,虽然我认为上面的简单示例相对容易,但我需要它泛化到任意形状的子区域。
有人对如何解决这个问题有建议吗?非常感谢!
为了更好地查看正在发生的情况,添加颜色栏会有所帮助。它显示了使用的级别和相应的颜色。
要使相应级别的颜色相同,绘图之间的级别应该相同:
import numpy as np
from matplotlib import pyplot as plt
grid_x = np.linspace(-5, 5, 500)
grid_y = np.linspace(-5, 5, 500)
xx, yy = np.meshgrid(grid_x, grid_y)
rand1 = np.ones((500, 500))
rand1[:, 250:] = 2
rand2 = np.zeros((500, 500))
rand2[:, 200:250] = 1
rand2[:, 250:] = 2
# common_levels = np.linspace(0, 2, 11)
common_levels = np.linspace(min(rand1.min(), rand2.min()), max(rand1.max(), rand2.max()), 11)
fig, axs = plt.subplots(ncols=2, nrows=2, figsize=(12, 6))
contour00 = axs[0, 0].contourf(xx, yy, rand1, alpha=.3, cmap='jet')
axs[0, 0].set_title('values 1 and 2, default levels')
plt.colorbar(contour00, ax=axs[0, 0])
contour01 = axs[0, 1].contourf(xx, yy, rand1, levels=common_levels, alpha=.3, cmap='jet')
plt.colorbar(contour01, ax=axs[0, 1])
axs[0, 1].set_title('values 1 and 2, common levels')
contour10 = axs[1, 0].contourf(xx, yy, rand2, alpha=.3, cmap='jet')
axs[1, 0].set_title('values 0, 1 and 2, default levels')
plt.colorbar(contour10, ax=axs[1, 0])
contour11 = axs[1, 1].contourf(xx, yy, rand2, levels=common_levels, alpha=.3, cmap='jet')
axs[1, 1].set_title('values 0, 1 and 2, common levels')
plt.colorbar(contour11, ax=axs[1, 1])
plt.tight_layout()
plt.show()