#python #python-3.x #matplotlib
#python #python-3.x #matplotlib
Вопрос:
У меня есть список с моими значениями limit_up, список со значениями limit_down и третий список, заполненный значениями ‘100’ (того же размера, что и остальные). Я бы хотел, чтобы область между limit_up и 100 была зеленой, а область между (100 или limit_up) и limit_down была красной, как показано на рисунке ниже.
Однако иногда, поскольку мой список limit_down не имеет значения ниже 100, область должна быть полностью зеленой. И то же самое должно произойти, когда все мои значения limit_up ниже 100, где область должна быть полностью красной. Кто-нибудь может помочь?
Данные для рисунка слева:
limit_down = ['8.5', '37.5', '45.2', '51.9', '55.0', '55.2', '56.7']
limit_up = ['982.6', '393.3', '286.2', '260.4', '232.9', '200.0', '201.7']
reference = [100 100 100 100 100 100 100]
Данные для рисунка справа:
limit_down = ['265.0', '649.1', '804.0', '895.1', '874.2', '957.9', '976.4']
limit_up = ['23815.5', '9043.4', '6932.4', '5805.6', '4510.5', '4317.5', '3963.5']
reference = [100 100 100 100 100 100 100]
Комментарии:
1. Можете ли вы сделать несколько примеров данных с этим аспектом?
2. Конечно, просто отредактировал вопрос! @ScottBoston
Ответ №1:
fill_between
и фильтрацию массива numpy можно использовать следующим образом для создания этих графиков:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 35, 7)
limit_down_1 = np.array([8.5, 37.5, 45.2, 51.9, 55.0, 55.2, 56.7])
limit_up_1 = np.array([982.6, 393.3, 286.2, 260.4, 232.9, 200.0, 201.7])
reference = 100
limit_down_2 = np.array([265.0, 649.1, 804.0, 895.1, 874.2, 957.9, 976.4])
limit_up_2 = np.array([23815.5, 9043.4, 6932.4, 5805.6, 4510.5, 4317.5, 3963.5])
fig, axes = plt.subplots(ncols=2, figsize=(12, 4))
for ax, limit_up, limit_down in zip(axes, [limit_up_1, limit_up_2], [limit_down_1, limit_down_2]):
ax.fill_between(x, np.maximum(reference, limit_down), limit_up, color='limegreen', alpha=0.3,
where=limit_up > reference, interpolate=True)
ax.fill_between(x, limit_down, np.minimum(reference, limit_up), color='crimson', alpha=0.3,
where=limit_down < reference, interpolate=True)
for y in (limit_up, limit_down):
ax.plot(x[y <= reference], y[y <= reference], color='crimson')
ax.plot(x[y >= reference], y[y >= reference], color='limegreen')
plt.show()