TRNSYS, Plotlyのサンプル
2020/01/29 サンプルファイルのダウンロードリンクを追加しました。この記事の最後のところにリンクを貼っておきます。
計算結果をPlotlyでグラフ化
以前に紹介したPlotlyですが、最近TRNSYSの計算結果をPlotlyで出力するのが社内でプチブームになっています。
普段はシミュレーション結果のグラフ化はExcelを使いがちです。
でもシミュレーションではパラメーターを振りながら繰り返し計算するケースが多いんですよね。その都度Excelでグラフ化するのも割と面倒です。
CSVを読み込んで、セルを選択して,グラフを作って、軸やラベルの調整と、何段階か作業が必要です。
Python, Plotlyの処理は一度スクリプトを用意すれば、あとは単に実行するだけでグラフが出来上がります。
HTML形式で保存できる点も良くて、打ち合せや納品データとして、メールで送るのにも重宝します。
Plotlyの処理例
以下、TRNSYSの計算結果をPlotlyで処理した例です。サンプルとして、TRNSYSのExamples
(C:\TRNSYS18\Examples\3D_Building\5_Step_Modify3D_Trnsys3d)の計算結果を処理しています。
まずは出力用にType65cを一個追加して、Type56の計算結果を出力します。
Type56とType65cの接続は以下の通り。この他、Left axisの1個目は気象データから外気温のデータをつないでおきます。
用意したPythonのソースコードは以下の内容です。今回は計算結果全てをプロットしています。助走期間を除いて一部だけ切り出す場合は、コメントで処理例を入れてあるので参考にしてください。
# Plotly example for TRNSYS.
# author Yuichi Yasuda @ quattro corporate design
# copyright 2020 quattro corporate design. All right reserved.
import pandas as pd
import plotly
import plotly.graph_objs as go
#計算結果
filename = r'Building_step5.plt'
# type65cヘッダー形式
# TIME Ambient TAIR_first_floor TAIR_second_floor QHEAT_first_floor QCOOL_first_floor QHEAT_second_floor QCOOL_second_floor
# +0.0000000000000000E+00 -7.0000000000000007E-01 +2.0000000000000000E+01 +2.0000000000000000E+01 +0.0000000000000000E+00 +0.0000000000000000E+00 +0.0000000000000000E+00 +0.0000000000000000E+00
# +1.0000000000000000E+00 +2.9500000000000002E+00 +1.9830580301798804E+01 +1.9728268297386307E+01 +0.0000000000000000E+00 +0.0000000000000000E+00 +0.0000000000000000E+00 +0.0000000000000000E+00
#ラベルの準備
#ファイルに含まれるヘッダーはtabを含んでいるため、改めてへダーを指定する。
labels = ['TIME', 'Ambient','TAIR_first_floor','TAIR_second_floor','QHEAT_first_floor','QCOOL_first_floor','QHEAT_second_floor','QCOOL_second_floor']
# 既存のヘッダーは無視して、新しくラベルを割り当ててCSVを読み込む
csv = pd.read_csv(filename,
delim_whitespace=True,
skiprows=1, #ヘッダーは読み飛ばす
# sep=',', #セパレーター(CSVの区切り文字)
header=None, #ヘッダーなし
names=labels #ラベル(ヘッダー)指定
)
# 1カラム目の「TIME」の値を日付時刻へ差し替える
# 標準年(1995年)の1/1 0:00で開始された日付時刻を生成して差し替える。
timestep = 1.0
period = len(csv.index)
step=str(timestep)+'H'
csv['TIME'] = pd.date_range('1995-01-01 0:00', periods=period, freq=step) # series for datetime column.
# 助走計算分を取り除く処理
#-------------------------------
# 例)12月分(31日分)のデータを切り出す
# start = int(24*31/timestep)*-1
# df = csv[start:]
# 例)最後の1年分のデータを切り出す
# df = csv[-8760:]
df = csv
# print(df)
print('平均値:', df['TAIR_first_floor'].mean())
print('平均値:', df['TAIR_second_floor'].mean())
#グラフ形式、表示するデータ、軸を指定する
# plotly.offline.init_notebook_mode(connected=False) # Jupyter note
traces = [
# go.Bar(x=df['TIME'], y=df['TAIR_first_floor']*-1, name='TAIR_first_floor', opacity=0.4, yaxis='y2'),
go.Scatter(x=df['TIME'], y=df['Ambient'], name='外気温', yaxis='y1', line=dict(color='gray', width=1, dash='dot')),
go.Scatter(x=df['TIME'], y=df['TAIR_first_floor'], name='first_floor', yaxis='y1'),
go.Scatter(x=df['TIME'], y=df['TAIR_second_floor'], name='second_floor', yaxis='y1'),
go.Scatter(x=df['TIME'], y=df['QHEAT_first_floor'], name='first_floor暖房負荷', opacity=0.4, yaxis='y2'),
go.Scatter(x=df['TIME'], y=df['QCOOL_first_floor'], name='first_florr冷房負荷', opacity=0.4, yaxis='y2'),
go.Scatter(x=df['TIME'], y=df['QHEAT_second_floor'], name='second_floor暖房負荷', opacity=0.4, yaxis='y2'),
go.Scatter(x=df['TIME'], y=df['QCOOL_second_floor'], name='second_floor冷房負荷', opacity=0.4, yaxis='y2'),
]
layout = go.Layout(
title ='計算結果',
legend = dict(x=1.04, y=1.0),
xaxis = dict(title='日付時刻'),
yaxis = dict(title='室温[C]',
range=[-10,40]),
yaxis2 = dict(title='暖冷房負荷[kJ/h]',
range=[0,30000],
overlaying='y',
side='right',
exponentformat='none', # prevent 'k' notation
separatethousands=True, # add a comma as a thousand separator
showgrid=False)
)
# data, layoutを指定してチャートを生成
fig = go.Figure(data=traces, layout=layout)
# Add range slider
fig.update_layout(
xaxis=go.layout.XAxis(
rangeselector=dict(
buttons=list([
dict(count=3,
label='3d',
step='day',
stepmode='backward'),
dict(count=7,
label='1w',
step='day',
stepmode='backward'),
dict(count=1,
label='1m',
step='month',
stepmode='backward'),
dict(count=6,
label='6m',
step='month',
stepmode='backward'),
dict(label='all',
step='all')
])
),
rangeslider=dict(
visible=True
),
type='date'
)
)
#プロットする
#plotly.offline.iplot(fig) # Jupyter note
plotly.offline.plot(fig, filename='Building_step5.html')
実行すると動画ようなブラウザで操作できるHTMLが出来上がります。
一部を拡大したり、ツールチップで値を表示できます。凡例をクリックすると表示のOn/Offを切り換えられます。 表示される値が多すぎて見にくい場合は、表示の調整が可能です。
使用したTRNSYSの計算結果、Python/Plotlyのスクリプト、Plotlyで生成されたHTMLファイルを貼って置きます。
TRNSYS,Plotlyのサンプル
動作環境
以下の環境で動作を確認しています。
Windows10 Pro(64bit, 1909)
TRNSYS18.02.0000(64bit)
Python 3.7.4
Plotly 4.5.0