電気出力の変数を、時系列にプロットします(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|
事実を、下記に、整理します。
- 出力をプロットする
- 各行ごとに、制御の値が一番低いものを、その行のメイン制御とする
(上記の例だと、上から、C、C、A、A、B、B、C、C、A)
やりたいこと
・出力とメイン制御を紐づけて、「出力をメイン制御ごとに色付けした上で、プロットしたい
上記の例だと、例えば、出力を、
1-2行目:赤(制御C)
3-4行目:青(制御A)
5-6行目:黄色(制御B)
7-8行目:赤(制御C)
9行目:青(制御A)
に、それぞれ色づけして、プロットしたいということです。
ややこしくて恐縮ですが、どうぞよろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア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
追記
上と同様に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")
投稿2018/07/25 06:35
編集2018/07/25 07:01総合スコア30933
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/25 08:04
2018/07/25 08:06
2018/07/25 08:13
2018/07/25 08:26
2018/07/25 08:56 編集
2018/07/25 08:57
2018/07/25 11:01 編集
2018/07/27 04:29
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。