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の計算結果を出力します。

Building_step5.tpfへType65cを追加

Type56とType65cの接続は以下の通り。この他、Left axisの1個目は気象データから外気温のデータをつないでおきます。

Type56, Type65cの接続
Type56, Type65cの接続

用意した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ファイルを貼って置きます。

動作環境

以下の環境で動作を確認しています。
Windows10 Pro(64bit, 1909)
TRNSYS18.02.0000(64bit)
Python 3.7.4
Plotly 4.5.0

Pocket

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です