解決したい問題:
以下の様にPandasのデータフレームをグラフ化した際にx軸にとった2日分の日付データがグラフ化した際に9つに分割され描画されてしまいます。この問題に2日間ほどハマってしまっており、ご意見やアドバイスなど頂戴できればと思います。よろしくお願い致します。
期待する結果:
本来であれば、以下の様に2日分のデータしか存在しないので、グラフ化した際のx軸の単位(間隔)は2つだけになってもらいたいのです。明示的にplt.xticks(['2018-12-23','2018-12-24'])設定を加える事で、意図した結果を得る事はできます。
ソースデータ:
ソースデータは以下のようにExecution Dateを含むエクセルファイルをPandasに読み込んでおります。エクセル上の該当のデータ・フォーマットはDate型で時間情報は含まないものが選択されています。
import seaborn as sns %matplotlib inline import sys, os, codecs, datetime, shutil, re, math, csv import xlsxwriter import pandas as pd import numpy as np import collections import openpyxl from openpyxl.drawing.image import Image import matplotlib.pyplot as plt import matplotlib.dates as mdates sns.set() dir = 'C:/Users/' today_date = datetime.date.today() report = pd.read_excel('%sPerformance_Report_%s.xlsx' % (dir,today_date)) report = report.set_index(["index"]) report = pd.DataFrame(report.T) report = report.drop(report.columns[[2,10,17,28,51,58,76]], axis=1) report['Execution Date'] = pd.to_datetime(report['Execution Date'],format='%Y-%m-%d') report['Target Date'] = pd.to_datetime(report['Target Date'],format='%Y-%m-%d') report_Count = pd.DataFrame(report[['Execution Date','A Count','B Count', 'C Count', 'D Count','E Count', 'F Count]]) report_Count = report_Count.reset_index(drop=True) #report_Count['Execution Date'] = pd.to_datetime(report_Count['Execution Date'],format='%Y-%m-%d') report_Count = report_Count.set_index(['Execution Date']) fig1, ax1 = plt.subplots(figsize=(16,5)) report_Count.plot(figsize=(16,5), alpha=1, title='OVERALL DISTRIBUTION', ax=ax1) ax1.set_xlabel('Execution Date') ax1.set_ylabel('Counts') #plt.xticks(['2018-12-23','2018-12-24']) ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) plt.tick_params(labelsize=12) plt.legend(bbox_to_anchor=(1.02, 1), loc='upper left', borderaxespad=0, fontsize=20) plt.subplots_adjust(left = 0.1, right = 0.8)
試したこと:
report_Count['Execution Date'] = pd.to_datetime(report_Count['Execution Date'],format='%Y-%m-%d')やax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))によって、明示的にフォーマットを指定してみましたが、結果は変わりませんでした。
暗黙的な時間情報をもっているのでは思い、dt.hourによって時間情報を確認した所、0という結果が2つの日付データに対して帰ってきたので、このあたり時間情報が存在しないと解釈されているのか、それとも午前0時をさしているのか判別がついていません。
print(df['Execution Date'].dt.hour)
0 0
1 0
Name: Execution Date, dtype: int64
print(df2.dtypes)
index
A Count object
B Count object
C Count object
D Count object
E Count object
F Count object
dtype: object
試したこと2:
hayataka2049様からのアドバイスに従って、別のシンプルなデータフレームを作成しmatplotlibの挙動を確認してみました。
hayataka2049様のご指摘の通り、対象の日付データの数が2日分しかない時のデフォルトの挙動のようです。
データの数を増やして見た所、問題なくx軸の間隔が存在するデータの日付単位になりました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/25 08:43