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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Matplotlib

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

Python

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

pandas

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

Q&A

解決済

1回答

3472閲覧

matplotlibのグラフに関して

enemy_x

総合スコア17

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Matplotlib

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

Python

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

pandas

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

0グッド

0クリップ

投稿2020/01/07 01:44

編集2020/01/07 02:02

前提・実現したいこと

ある機械の可動率をデータで吸い上げ、Pythonでデータ処理をして見える化しようとしています。
matplotlibによってグラフを描いてみたのですが、思ったような結果にならず困っています。

得たい結果としては、
①x軸の不要なラベルを除去したい
②x軸ラベルの日付表記が、CSVデータでは%Y/%m/%dのはずなのに%Y-%m-%dになってしまっているので%Y/%m/%d表記にしたい
③y軸の左側のラベルのグリッド線と、右側ラベルのグリッド線がずれているので揃えたい

プロットされたグラフは下図を参照ください。

以上よろしくお願いします。

発生している問題・エラーメッセージ

上図を参照ください。

該当のソースコード

#! python3 #! utf-8 import pandas as pd import matplotlib.pyplot as plt import datetime import matplotlib.dates as mdates import numpy as np from matplotlib.dates import DateFormatter from dateutil.parser import parse from matplotlib.font_manager import FontProperties fp = FontProperties(fname=r'c:\Windows\Fonts\meiryo.ttc') from pandas.plotting import register_matplotlib_converters register_matplotlib_converters() %matplotlib inline #jupyternotebookに図を埋め込む %reload_ext autoreload #オートリロード %autoreload 2 data1 = pd.read_csv("MCM00000000226C1313_2019-12-02.csv") data2 = pd.read_csv("MCM00000000226C1313_2019-12-03.csv") data3 = pd.read_csv("MCM00000000226C1313_2019-12-04.csv") data4 = pd.read_csv("MCM00000000226C1313_2019-12-05.csv") data5 = pd.read_csv("MCM00000000226C1313_2019-12-06.csv") data6 = pd.read_csv("MCM00000000226C1313_2019-12-07.csv") concat_data = pd.concat([data1,data2,data3,data4,data5,data6],ignore_index=True) #データ結合 drop_data = concat_data.drop(['SERIAL', 'IPADDRESS', 'E4', 'STE4','STE5','CE', 'CS'], axis=1) #不要なカラム削除 drop_data.columns = ['時刻', '段取時間[s]', '総生産数[個]', '可動率[%]', '背番'] #カラム名を日本語に変更 drop_data.round(2) #データを小数点以下2桁へ変更 change_data = drop_data[['時刻','背番','可動率[%]','総生産数[個]','段取時間[s]']] #カラム位置を変更 change_data['時刻'] = pd.to_datetime(change_data['時刻'],format='%Y-%m-%d') #時刻表記を変更 change_data['曜日'] = change_data['時刻'].dt.strftime('%A') #生産終了時の可動率のみピックアップ select_data = change_data[((change_data['時刻'].dt.hour==16) & (change_data['時刻'].dt.minute==0)) |((change_data['時刻'].dt.hour==3) & (change_data['時刻'].dt.minute==30) | (change_data['時刻'].dt.hour==1) & (change_data['時刻'].dt.minute==40) & (change_data['曜日'] == 'Saturday'))] select_data = select_data.reset_index(drop = True) #昼勤の可動率のみピックアップ d_data = change_data[(change_data['時刻'].dt.hour==16) & (change_data['時刻'].dt.minute==0)] d_data = d_data.reset_index(drop = True) d_data['時刻'] = d_data['時刻'].dt.date #夜勤の可動率のみピックアップ n_data = change_data[(change_data['時刻'].dt.hour==3) & (change_data['時刻'].dt.minute==30) | (change_data['時刻'].dt.hour==1) & (change_data['時刻'].dt.minute==40) & (change_data['曜日'] == 'Saturday')] n_data = n_data.reset_index(drop = True) n_data['時刻'] = n_data['時刻'].dt.date #グラフ化 plt.close(1) left = d_data['時刻'] bar_height = d_data['総生産数[個]'] line_height = d_data['可動率[%]'] # 折れ線グラフを出力 fig, ax1 = plt.subplots() ax1.plot(left, line_height, linewidth=2, color="orange") ax1.xaxis.set_major_locator(mdates.DayLocator(bymonthday=None, interval=1, tz=None)) labels = ax1.get_xticklabels() plt.ylim(60,100) plt.setp(labels, rotation=45, fontsize=8); # 棒グラフを出力 ax2 = ax1.twinx() ax2.bar(left, bar_height,color="royalblue", linewidth=4, width= 0.5) plt.ylim(7000,13000) ax1.grid()

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

OS:Windows10
python3
jupyter notebook

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

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

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

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

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

guest

回答1

0

ベストアンサー

(1) x軸の不要なラベルを除去したい
現状のコードで、すでに

Python

1ax1.xaxis.set_major_locator(mdates.DayLocator(interval=1))

のように DayLocatorを設定しているので問題ないのではないでしょうか

(2) x軸ラベルの日付表記が、CSVデータでは%Y/%m/%dのはずなのに%Y-%m-%dになってしまっているので%Y/%m/%d表記にしたい

set_major_formatter()にて DateTime用のFormatterを設定すると良いと思います。

Python

1ax1.xaxis.set_major_formatter(mdates.DateFormatter("%m/%d"))

(3) y軸の左側のラベルのグリッド線と、右側ラベルのグリッド線がずれているので揃えたい
単純に、右側のTickerLabelの数と右側の目盛りの数を揃えると良いのではないでしょうか。
現状左側の設定は

Python

1ax1.set_ylim(60,100)

となっており、60~100の5Stepで目盛りが書かれておりますので、左側も

Python

1ax1.set_ylim(7000,15000)

などとして、7000~15000の1000Stemで目盛りを書くようにすると、ズレがなくなるのではないでしょうか

以下は質問のコードをダミーデータで描画するようにしたサンプルです。

Python

1import numpy as np 2import pandas as pd 3import matplotlib.pyplot as plt 4 5import matplotlib.dates as mdates 6 7#ダミーデータ生成 8N=24*8 9change_data = pd.DataFrame({'時刻':pd.date_range('2019-12-02', periods=N, freq='H'), 10 '可動率[%]':np.random.normal(80, 5, N), 11 '総生産数[個]':np.random.normal(10000, 500, N)}) 12change_data['曜日'] = change_data['時刻'].dt.strftime('%A') 13 14#昼勤の可動率のみピックアップ 15d_data = change_data[(change_data['時刻'].dt.hour==16) & (change_data['時刻'].dt.minute==0)] 16d_data = d_data.reset_index(drop = True) 17d_data['時刻'] = d_data['時刻'].dt.normalize() 18 19left = d_data['時刻'] 20bar_height = d_data['総生産数[個]'] 21line_height = d_data['可動率[%]'] 22 23# 折れ線グラフを出力 24fig, ax1 = plt.subplots() 25ax1.plot(left, line_height, linewidth=2, color="orange") 26ax1.xaxis.set_major_locator(mdates.DayLocator(interval=1)) 27ax1.xaxis.set_major_formatter(mdates.DateFormatter("%m/%d")) 28ax1.tick_params(axis='x', rotation=45, labelsize=8) 29ax1.set_ylim(60,100) 30 31# 棒グラフを出力 32ax2 = ax1.twinx() 33ax2.bar(left, bar_height,color="royalblue", linewidth=4, width= 0.5) 34ax2.xaxis.set_major_locator(mdates.DayLocator(interval=1)) 35ax2.xaxis.set_major_formatter(mdates.DateFormatter("%m/%d")) 36num_of_ticks = len(ax1.get_yticks()) 37ax2.set_ylim(7000,(num_of_ticks-1)*1000+7000) 38 39ax1.grid()

イメージ説明

投稿2020/01/07 04:17

magichan

総合スコア15898

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

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

enemy_x

2020/01/07 04:37

magichan様 いつも助けていただきありがとうございます! ご教授いただいた通り修正して、希望どおりの結果を得ることができました。 今後ともよろしくお願いいたします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問