質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

3343閲覧

Pandas、matplotlibのグラフ化でx軸の間隔が9つに分割されてしまう

minhouse10

総合スコア41

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2018/12/25 07:45

編集2018/12/25 08:41

解決したい問題:
以下の様に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軸の間隔が存在するデータの日付単位になりました。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

matplotlibがそういう挙動だから、としか言えないと思います。

plt.xticks(['2018-12-23','2018-12-24'])で特に不都合なことがなければそれで使えば良いです。

投稿2018/12/25 08:10

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minhouse10

2018/12/25 08:43

hayataka2049様、アドバイス頂き本当にありがとうございます!頂戴いたしましたアドバイスに従って、別のシンプルなデータフレームを作成しmatplotlibの挙動を確認してみました。 hayataka2049様のご指摘の通り、対象の日付データの数が2日分しかない時のデフォルトの挙動のようです。データが3日分以上になった場合は問題なく対象日付のデータの数分のみx軸に表示されるようになりました。改めて早速のご回答ありがとうございました。感謝です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問