Matplotlib boxplot легенда без использования топора - PullRequest
0 голосов
/ 12 марта 2020

Есть ли способ создать легенду боксплота в matplotlib без использования возвращаемого значения ax.boxplot(), как в Добавление легенды в блокпост matplotlib с несколькими сюжетами на одинаковых осях ?

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

n = 480
ts = pd.Series(np.random.randn(n), index=pd.date_range(start="2014-02-01", periods=n, freq="H"))
for i, frame in zip(range(ts.index.dayofyear.nunique()), 
                        ts.index.dayofyear.unique()):
    plt.boxplot(ts[ts.index.dayofyear == frame], positions=[i], widths=0.9)

Выше приведен пример кода игрушки. В моем проекте я на самом деле каждый раз вызываю plt.boxplot() в отдельной функции (используется несколько вызовов функции, но используется одна и та же ось), и я не хочу делать никаких новых возвращаемых значений и значений параметров.

Есть ли способ создать легенду для блокпостов без использования этих возвращаемых значений, как в других типах графиков (путем передачи label=...)?

1 Ответ

0 голосов
/ 12 марта 2020

Поскольку вы используете серию Pandas, рассмотрите решение для Pandas, которое все еще взаимодействует с matplotlib. Сначала вам нужно будет преобразовать серию данных во фрейм данных и назначить необходимые столбцы индикатора hour и day . При таком подходе вы можете передать объект ax в качестве аргумента и использовать его для дополнительных нужд или использовать значения по умолчанию с DataFrame.plot:

# CONVERT TO DATA FRAME WITH day AND hour COLUMNS
ts_df = (ts.to_frame()
           .rename({0:'value'}, axis='columns')
           .assign(hour = lambda x: x.index.hour,
                   dayofyear = lambda x: x.index.dayofyear)
        )

ts_df.head()            
#                         value  hour  dayofyear
# 2014-02-01 00:00:00 -0.555308     0         32
# 2014-02-01 01:00:00  0.720157     1         32
# 2014-02-01 02:00:00 -1.140971     2         32
# 2014-02-01 03:00:00 -0.359197     3         32
# 2014-02-01 04:00:00 -2.241330     4         32

seaborn.set()
for i, g in ts_df.groupby(['dayofyear']):
    myfig, myaxes = plt.subplots(figsize = (8,4))
    g['value'].plot(kind = 'box', ax = myaxes, 
                        title = 'Hourly Value Boxplot in Day {}'.format(i))
    # myaxes.legend(...)

    plt.show()  

First Plot Output

В качестве альтернативы, если вам нужны все коробочные графики на одном участке, pivot данные для столбцов дня:

ts_pvt_df = ts_df.pivot(index='hour', columns = 'dayofyear', values = 'value')

seaborn.set()
myfig, myaxes = plt.subplots(figsize = (12,6))
ts_pvt_df.plot(kind = 'box', ax = myaxes, title = 'Hourly Value Boxplots by Day')

plt.show()  

Second Plot Output

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