Как я могу заменить ежедневные метки оси X на месяцы, но сохранить график, показывающий дневные значения? - PullRequest
0 голосов
/ 19 сентября 2019

Я хочу нарисовать диаграмму из моего фрейма данных (который содержит данные за день) и хочу, чтобы xlables отображались в виде месяцев (охватывающих весь дневной период данных).Например, если у меня есть данные с 2010-01-01 по 2010-12-31, я хочу получить данные за 365 дней, но по оси x я хочу только январь, февраль, март и т. Д. Каждый из этих месяцев охватываетточный период соответствующих дней.Изо всех сил пытаясь получить это ...

Это DataFrame:

    Daily CP ROI S2     positive    Month   Day
Date                
2008-01-02  100087.000  True    January     2
2008-01-03  101967.000  True    January     3
2008-01-04  102167.000  True    January     4
2008-01-07  104004.000  True    January     7
2008-01-08  105192.000  True    January     8


pl_plot = pl_plot.set_index('Date')
figure(num=None, figsize=(20, 8), dpi=80, facecolor='w', edgecolor='k')
plt.ylabel('USD', fontsize=18)
plt.rc('ytick',labelsize=16)
final_value = new_df_test.iloc[ei-2]['Daily_Compound_ROI']
roi = round(((final_value - very_init_budget)/very_init_budget)*100,3)
roi_s=str(roi)
plt_title_s = new_title+'\nPeriod: '+y_init_s+'-'+y_end_s+', (ROI: '+roi_s+'%)'
plt.title(plt_title_s, fontsize=24)
pl_plot['positive'] = pl_plot['Daily_Compound_ROI'] > 100000
pl_plot['Daily CP ROI S2'].plot(kind='bar', color=pl_plot.positive.map({True: '#5cb85c', False: 'r'}))
ax1 = plt.axes()
plt.rc('xtick',labelsize=14)
x_axis = ax1.axes.get_xaxis()
x_axis.set_visible(True)

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

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

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

IIUC вы можете попробовать seaborn.

Если вы добавите столбец месяца и дня к вашему фрейму данных, вы можете создать барпот с ежемесячно разделенными блоками баров.в день.


Пример:

# import pandas as pd
# import numpy as np

# df = pd.DataFrame(index=pd.date_range('15.8.2019', '27.11.2019'))
# df['Value'] = np.random.random(len(df))
# df['Month'] = df.index.month_name()
# df['Day'] = df.index.day

#                Value     Month Day
# 2019-08-15  0.813130    August  15
# 2019-08-16  0.850873    August  16
# 2019-08-17  0.728416    August  17
# 2019-08-18  0.326072    August  18
# 2019-08-19  0.880385    August  19
#              ...       ...  ..
# 2019-11-23  0.771801  November  23
# 2019-11-24  0.638811  November  24
# 2019-11-25  0.824542  November  25
# 2019-11-26  0.451075  November  26
# 2019-11-27  0.151469  November  27

для данного кадра данных вы можете сделать

import seaborn as sns

sns.catplot(kind='bar', x='Month', y='Value', hue='Day', data=df, color='b', legend=False)

результаты

enter image description here

0 голосов
/ 19 сентября 2019

Это выглядит довольно странно, когда я отвечаю на свой вопрос.В любом случае, я нашел способ:

from matplotlib.dates import DateFormatter
import matplotlib.dates as mdates
import seaborn as sns
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
sns.set(font_scale=1.5, style="whitegrid")
fig, ax = plt.subplots(figsize=(20, 8))
ax.bar(df.index.values, df['Daily CP ROI S2'].values, width=1, color=pl_plot.positive.map({True: '#5cb85c', False: 'r'}))
ax.set(#xlabel="Period", ylabel="USD", title=title1)
ax.title.set(fontsize=24)
ax.xaxis.set_major_locator(mdates.MonthLocator(interval=1))
ax.xaxis.set_major_formatter(DateFormatter("%b"))
plt.show()

вышеизложенное решает проблему, и вот что я получаю, это:

Диаграмма, как я хотел

Единственная проблема, которая осталась, это то, что мне нужно, чтобы вписать название в таблицу :). Я позабочусь об этом, но если есть предложения, пожалуйста, продолжайте!Благодаря.

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