Создание нескольких графиков на одной оси с данными разной длины - PullRequest
1 голос
/ 14 марта 2020

В настоящее время я анализирую урожай кукурузы в соответствии с датами, когда они были посажены в более чем 5000 местах. У меня есть датафрейм с колонкой для дат и колонкой для доходности.

Я хотел бы создать несколько коробочных графиков (на одной оси) для сравнения доходности за каждый месяц. Поскольку количество мест, в которых сажали кукурузу в каждом месяце, различно (например, 250 мест, в которых кукуруза была посажена в марте, и 529 в апреле), я изо всех сил стараюсь создать этот блокпост.

Для разбиения столбца по месяцу я использовал следующий код:

march1 = '03/01/17'
march2 = '03/31/17'
april1 = '04/01/17'
april2 = '04/30/17'
march = (joint['date']>=march1)&(joint['date']<=march2)
marc = joint.loc[march]
april = (joint['date']>=april1)&(joint['date']<=april2)
apri = joint.loc[april]

Затем я попробовал несколько различных методов для построения прямоугольного графика. Я пытался создать новый фрейм данных с колонкой для каждого месяца. Но поскольку длина каждого месяца различна, Python помещает все данные в один столбец, а остальные имеют только значения NA. Таким образом, когда я строю график, я вижу только один график из всех данных вместе взятых. Возможным решением может быть добавление значений NA к более коротким месяцам, но я не уверен, как это сделать? (Другая возможная проблема может заключаться в том, что номера строк из исходного набора данных не являются взаимными). Ниже приведен код, который я пробовал

meteo = {'march':marc['yields'], 'april':apri['yields']}
meteo_df = pd.DataFrame(meteo, columns=['march', 'april'])
sns.boxplot(meteo_df)

Я также пытался сначала преобразовать месячные данные в список, а затем построить график коробочный участок Но я вижу одни и те же проблемы (все объединяются в один список / не имеют одинаковую длину)

mmm = marc['yields'].to_list()
nnn = apri['yields'].to_list()
alist = [[mmm,nnn]]
sns.boxplot(alist)

Есть ли какие-то решения для этого или это просто невозможно?

Визуализация данных

    yields   date
0   13.20    2017-06-13
1   4.40     2017-05-20
3   4.10     2017-05-23
4   5.10     2017-05-23
5   3.60     2017-06-17
...
...
...
4849 0.00    2018-06-25
4850 0.00    2018-06-22
4851 0.00    2018-06-21
4852 0.00    2018-06-21
4853 0.25    2018-05-22

1 Ответ

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

Графики Сравните распределение в категории, я бы построил их ежемесячно. Или вы имеете в виду график для каждого года бок о бок?

Данные

data={'yield':[13.2 ,  4.4 ,  4.1 ,  5.1 ,  3.6 ,  7.6 ,  5.  ,  7.9 ,  4.  ,
        3.25,  4.7 ,  4.9 ,  5.5 ,  8.6 ,  7.6 ,  5.  ,  7.9 ,  4.  ,
        3.25], 'date':['13/06/2017', '20/05/2017', '23/05/2017', '23/05/2017',
       '17/06/2017', '25/06/2018', '22/06/2018', '21/06/2018',
       '21/06/2018', '22/05/2018', '20/02/2019', '23/05/2019',
       '23/05/2019', '17/03/2019', '25/06/2017', '22/07/2019',
       '23/06/2018', '2018-06-21', '22/05/2018']}

Установите дату в дату и время и извлеките месяц, используя индекс даты и времени

df=pd.DataFrame.from_dict(data)
df['date']=pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
df['Month']=df.index.month

График для каждого месяца за все годы вместе

import seaborn as sns
fig, ax=plt.subplots()
ax = sns.boxplot(x="Month", y="yield", data=df)

Если вы хотите, чтобы год был рядом. Пожалуйста, добавьте другой столбец, год;

df['Year']=df.index.year

Затем график

y = sns.catplot(x="Month", y="yield",
                col="Year",
                data=df, kind="box")
...