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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

Q&A

解決済

2回答

4478閲覧

時系列プロット、変数の性質ごとに色付けしたい

shin_shin

総合スコア96

Matplotlib

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

0グッド

1クリップ

投稿2018/07/25 05:25

電気出力の変数を、時系列にプロットします(7-12月まで、1秒ごと)。
それを、制御の種類ごとに、色付けしたいです。下記に、例を示します。

|出力|制御A|制御B|制御C|
|:--|:--:|--:|
|100|2|8 | 1|
|100|2|5 | 1|
|150|3|4 | 9|
|150|3|5 | 6|
|200|5|2 | 7|
|200|5|2 | 7|
|170|2|8 | 1|
|170|2|8 | 1|
|80|2|8 | 9|

事実を、下記に、整理します。

  1. 出力をプロットする
  2. 各行ごとに、制御の値が一番低いものを、その行のメイン制御とする

(上記の例だと、上から、C、C、A、A、B、B、C、C、A)

やりたいこと
・出力とメイン制御を紐づけて、「出力をメイン制御ごとに色付けした上で、プロットしたい

上記の例だと、例えば、出力を、
1-2行目:赤(制御C)
3-4行目:青(制御A)
5-6行目:黄色(制御B)
7-8行目:赤(制御C)
9行目:青(制御A)
に、それぞれ色づけして、プロットしたいということです。

ややこしくて恐縮ですが、どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

とりあえず横軸をDatetime型にして書いてみました。

ライングラフにて線の色を変える場合、LineCollection を作成する必要がありますので以下のようになります。

横軸が時系列ということで、データの一部を適当に修正しております。

Python

1import matplotlib.pyplot as plt 2import matplotlib.lines as mlines 3import matplotlib.dates as mdates 4from matplotlib.collections import LineCollection 5from matplotlib.colors import ListedColormap 6import pandas as pd 7import numpy as np 8import io 9 10txt = """ 11日時,出力,制御A,制御B,制御C 122018/7/1 10:00,100,2,8,1 132018/7/1 10:01,100,2,5,1 142018/7/1 10:02,150,3,4,9 152018/7/1 10:03,150,3,5,6 162018/7/1 10:04,200,5,2,7 172018/7/1 10:05,200,5,2,7 182018/7/1 10:06,170,2,8,1 192018/7/1 10:07,170,2,8,1 202018/7/1 10:08,80,2,8,9 21""" 22 23df = pd.read_csv(io.StringIO(txt), parse_dates=['日時'], index_col='日時') 24df['メイン制御'] = df[["制御A","制御B","制御C"]].idxmin(axis=1) 25df['メイン制御'] = df['メイン制御'].map({"制御A":0,"制御B":1,"制御C":2}) 26 27colors = ['r', 'g', 'b'] 28cmap = ListedColormap(colors) 29 30inxval = mdates.date2num(df.index.to_pydatetime()) 31points = np.array([inxval, df['出力']]).T.reshape(-1,1,2) 32segments = np.concatenate([points[:-1], points[1:]], axis=1) 33lc = LineCollection(segments, cmap=cmap) 34lc.set_array(df['メイン制御']) 35 36ax = plt.subplot() 37ax.add_collection(lc) 38ax.xaxis.set_major_locator(mdates.MinuteLocator(interval=5)) 39ax.xaxis.set_major_formatter(mdates.DateFormatter("%m/%d %H:%M")) 40ax.set_ylabel('Power') 41ax.autoscale_view() 42ax.legend(handles = [ 43 mlines.Line2D([],[],color=colors[0], label="Control A"), 44 mlines.Line2D([],[],color=colors[1], label="Control B"), 45 mlines.Line2D([],[],color=colors[2], label="Control C")]) 46plt.show()

イメージ説明

投稿2018/07/27 01:09

magichan

総合スコア15898

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

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

0

書いてみました。

python

1import io 2import pandas as pd 3import matplotlib.pyplot as plt 4 5txt = """ 6出力 制御A 制御B 制御C 7100 2 8 1 8100 2 5 1 9150 3 4 9 10150 3 5 6 11200 5 2 7 12200 5 2 7 13170 2 8 1 14170 2 8 1 1580 2 8 9 16""" 17 18df = pd.read_table(io.StringIO(txt), delimiter="\t", header=0) 19print(df) 20""" => 21 出力 制御A 制御B 制御C 220 100 2 8 1 231 100 2 5 1 242 150 3 4 9 253 150 3 5 6 264 200 5 2 7 275 200 5 2 7 286 170 2 8 1 297 170 2 8 1 308 80 2 8 9 31""" 32 33df["メイン制御"] = df.apply(lambda s: s.idxmin(), axis=1) 34 35c_dict = {"制御A":"b", "制御B":"y", "制御C":"r"} 36df.plot(y="出力", kind="bar", color=df["メイン制御"].map(lambda x:c_dict[x])) 37plt.savefig("result.png") 38

result.png
イメージ説明

追記

上と同様にpandasでやろうとした・・・らなかなか思い通りにplotできなかったので、生matplotlibで書いてみたコード。コードの見た目はともかく、結果はこんな感じで良いでしょうか。

python

1import io 2import pandas as pd 3import matplotlib.pyplot as plt 4 5txt = """ 6出力 制御A 制御B 制御C 7100 2 8 1 8100 2 5 1 9150 3 4 9 10150 3 5 6 11200 5 2 7 12200 5 2 7 13170 2 8 1 14170 2 8 1 1580 2 8 9 16""" 17 18df = pd.read_table(io.StringIO(txt), delimiter="\t", header=0) 19print(df) 20""" => 21 出力 制御A 制御B 制御C 220 100 2 8 1 231 100 2 5 1 242 150 3 4 9 253 150 3 5 6 264 200 5 2 7 275 200 5 2 7 286 170 2 8 1 297 170 2 8 1 308 80 2 8 9 31""" 32 33df["メイン制御"] = df.apply(lambda s: s.idxmin(), axis=1) 34 35c_dict = {"制御A":"b", "制御B":"y", "制御C":"r"} 36 37plt.figure() 38for label in ["制御A","制御B","制御C"]: 39 tmp = df[df["メイン制御"]==label] 40 plt.bar(tmp.index, tmp["出力"], 41 color=c_dict[label], 42 label=label, 43 align="center") 44plt.xticks(df.index) 45plt.legend() 46plt.savefig("result2.png")

result2.png
イメージ説明

投稿2018/07/25 06:35

編集2018/07/25 07:01
hayataka2049

総合スコア30933

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

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

hayataka2049

2018/07/25 06:36

凡例がいまいちだから直します
shin_shin

2018/07/25 08:04

すみません:( 横軸は、数字のindexでいいので、時系列の折れ線グラフにしていただきたいです。
hayataka2049

2018/07/25 08:06

折れ線を区間ごとに色分けするということですか?
shin_shin

2018/07/25 08:13

はい、そうです:)
hayataka2049

2018/07/25 08:26

それだと、質問文には 1-2行目:赤(制御C) 3-4行目:青(制御A) ... とありますが、たとえば2-3行目はどんな色になりますか?
shin_shin

2018/07/25 08:56 編集

前の色で繋げてください。つまり、 1-3: 赤 3-5:青 5-7:黄 7-9:赤 になります。
shin_shin

2018/07/25 08:57

よろしくお願いいたします:)
hayataka2049

2018/07/25 11:01 編集

少なくとも今日中は無理だと思いますが、時間があるときに追記します
shin_shin

2018/07/27 04:29

すみません、ほかの方が、時系列のプロットを書いていただきました:(
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問