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