#python #matplotlib
#python #matplotlib
Вопрос:
Я пытаюсь изменить цвет штриховки заштрихованной области, но, похоже, ничего не работает.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
x_range = np.linspace(0, 1, 30)
y_range = np.linspace(0, 1, 30)
Z = np.zeros([30, 30])
Z[:10, :] = -1
Z[-10:, :] = 1
fig, ax = plt.subplots(constrained_layout = True)
cond1 = (Z != -1)
mZ1 = np.ma.array(Z, mask=cond1)
gains_map = ListedColormap(['gainsboro'])
col1 = ax.pcolor(x_range, y_range, mZ1, cmap = gains_map)
hatch1 = ax.pcolor(x_range, y_range, mZ1,
hatch = '\ \', zorder = 2, alpha = 0)
cond2 = (Z != 1)
mZ2 = np.ma.array(Z, mask=cond2)
coral_map = ListedColormap(['lightcoral'])
col2 = ax.pcolor(x_range, y_range, mZ2, cmap = coral_map)
hatch2 = ax.pcolor(x_range, y_range, mZ2,
hatch = '\ \', edgecolor = 'chocolate', zorder = 2, alpha = 0)
В этом примере я бы хотел, чтобы штриховки красной области были другого цвета, кроме черного (но не влияли на цвет штриховок в серой области). Области здесь прямоугольные, поэтому возможны другие решения, но я хотел бы что-то, что работает и для более сложных областей, созданных маской. Любая помощь будет оценена.
Комментарии:
1. Почему прозрачность установлена на 0? Попробуйте изменить его на
alpha=0.4
.2. Причина в том, что если для alpha установлено значение, отличное от нуля, замаскированная область будет заполнена cmap по умолчанию, похоже, нет способа отключить это. Установка альфа на ноль не влияет на края (к которым предположительно принадлежат штриховки).
Ответ №1:
Что нужно попробовать:
- используйте listedcolor map с
'none'
as color, чтобы сделать facecolor невидимым - используйте ширину строки, равную нулю, для подавления линий между ячейками
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
x_range = np.linspace(0, 1, 31)
y_range = np.linspace(0, 1, 31)
Z = np.zeros([30, 30])
Z[:10, :] = -1
Z[-10:, :] = 1
fig, ax = plt.subplots(constrained_layout=True)
cond1 = (Z != -1)
mZ1 = np.ma.array(Z, mask=cond1)
gains_map = ListedColormap(['gainsboro'])
none_map = ListedColormap(['none'])
col1 = ax.pcolor(x_range, y_range, mZ1, cmap=gains_map)
hatch1 = ax.pcolor(x_range, y_range, mZ1, cmap=none_map,
hatch='\ \', edgecolor='red', lw=0, zorder=2)
cond2 = (Z != 1)
mZ2 = np.ma.array(Z, mask=cond2)
coral_map = ListedColormap(['lightcoral'])
col2 = ax.pcolor(x_range, y_range, mZ2, cmap=coral_map)
hatch2 = ax.pcolor(x_range, y_range, mZ2, cmap=none_map,
hatch='\ \', edgecolor='green', lw=0, zorder=2)
plt.show()
Комментарии:
1. Спасибо JohanC, предложение использовать listedcolor map с
'none'
отлично работает! Однако мне совершенно непонятно, почему нужно использовать такую реализацию unraightforward. Это также относится к необходимости создания listedcolor map с одним цветом только для отображения всех значений массива Z одним цветом, в отличие от простой возможности передавать аргумент color вместо cmap.2. Вероятно
pcolor
, изначально не был разработан для работы только с одним цветом или для использования штриховки (и изначально, вероятно, без маскированных массивов). PS: обратите внимание, что вам нужно 31 x-значение и 31 y-значение для ячеек 30×30. Значения x и y определяют границы ячеек.