Как заставить matplotlib plt.fill_between работать успешно - PullRequest
0 голосов
/ 13 июля 2020

Я просмотрел несколько сообщений по этому поводу, но пока ни один из них не работал. У меня есть фрейм данных pandas, wp_df (извините за неправильное форматирование столбца из копирования / вставки, но вы поняли идею):

wp  game_seconds_remaining game_half
18906  0.901082                     0.0  Overtime
18905  0.932920                    22.0  Overtime
18904  0.688796                    28.0  Overtime
18903  0.735589                    32.0  Overtime
18902  0.730993                    72.0  Overtime
...         ...                     ...       ...
18749  0.471634                  3664.0     Half1
18748  0.513039                  3702.0     Half1
18747  0.541705                  3743.0     Half1
18746  0.541372                  3776.0     Half1
18745  0.564195                  3813.0     Half1

Я построил линию диаграммы рассеяния из wp_df ['wp' ] с помощью plt.plot (), в результате получится следующее изображение: Диаграмма вероятности выигрыша

Я добавил несколько горизонтальных и вертикальных линий для наглядности. Я хотел бы заштриховать области между красной линией диаграммы рассеяния и синей горизонтальной линией при y = 0,50. -> Обратите внимание, что я изменил галочки x и y. X находится в диапазоне от максимальных значений wp_df ['game_seconds_remaining] (в данном случае 3813.0) до 0,0 (ось x перевернута), а y варьируется от 0,0 до 1,0.

В любом случае, я хочу затенять область между красной линией разброса и горизонтальной линией в 0,50 по обе стороны от горизонтальной линии, с разным цветом на каждой. Я пробовал использовать plt.fill_between(wp_df['wp'], 0.50, color='blue') для одной стороны затенения, но это не сработало.

Есть какие-нибудь предложения, как я могу это сделать?

1 Ответ

1 голос
/ 13 июля 2020

Просто заполните небольшую дополнительную информацию на основе вашего комментария с C Йоханом. Вы можете использовать условие where из fill_between, чтобы указать определенные c блоки для заполнения. Есть хороший пример здесь , но вот пример, более похожий на ваши данные:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

x = range(200)
y = np.concatenate((np.random.randint(0,50,50), np.random.randint(50,100,50),
                    np.random.randint(0,50,50), np.random.randint(50,100,50)))

fig, ax = plt.subplots(figsize=(7,3.5))

ax.plot(x, y, color='red')
ax.axhline(50,0,200,color='blue')

ax.fill_between(x,y,50,where=(y<50), alpha=.3, color='orange')
ax.fill_between(x,y,50,where=(y>=50), alpha=.3, color='blue')

введите описание изображения здесь

Таким образом, если у вас есть одно условие с двумя вариантами (т.е. выше или ниже 50), вы можете использовать два вызовов fill_between. y<50 и y>=50 - это логические массивы, обозначающие точки, в которых y выше и ниже 50. Обратите внимание, что два вызова заполняют здесь 4 разные области графика.

Код из @ Johan C в комментарии следует просто изменить, чтобы повторить вышесказанное!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...