Сопоставление определенного значения с цветом с помощью контура в matplotlib

#python #matplotlib #contourf

Вопрос:

Я пытался решить эту проблему в течение нескольких дней, но ни одно из решений, которые я нашел в Интернете, похоже, не работает для меня очень хорошо, несмотря на то, насколько простой кажется проблема.

 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), однако я не могу гарантировать, что это для моего проекта, так что это неверное решение.

Еще одна моя мысль заключалась в том, чтобы нанести на карту каждый регион отдельно. Однако я не уверен, как это сделать, и хотя я полагаю, что это было бы относительно легко для простого примера выше, мне нужно обобщить его на любые субрегионы произвольной формы.

У кого-нибудь есть предложения о том, как исправить эту проблему? Большое спасибо!

Ответ №1:

Чтобы лучше видеть, что происходит, полезно добавить цветовую панель. Он показывает используемые уровни и соответствующие цвета.

Чтобы иметь одинаковые цвета для соответствующих уровней, уровни должны быть одинаковыми между участками:

 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()  

сравнение контурных участков с общими уровнями и без них