機械系エンジニアの備忘録

20代独身社会人。仕事では機械・機構の研究開発を行っているエンジニアが、自分の専門分野ではないpythonを扱って楽しむブログです。

MENU

PythonのPlotlyでカッコいい3次元グラフを描く

Plotlyで動かせる、数値を表示できる、2次元と3次元を切り替えられるグラフを作る

 

1. はじめに

これまでPythonでグラフを作るときはMatplotlibを利用していましたが、最近はPlotlyというライブラリを利用する事が多くなりました。PlotlyはMatplotlibと比べて、

・そこまで有名でないため日本語の情報量が少ない

Tkinterなど他ライブラリとの連携が劣っている

などのデメリットがありますが、

・マウスで自由に動かせる3次元グラフが作れる

・グラフにマウスを近づけるとその点の値をリアルタイムで表示できる

・ボタンやスライダーを使ってグラフの種類やスタイルを瞬時に変えることができる

などMatplotlibには無い機能も揃えており、分かりやすいグラフが描けます。ということで、Plotlyの使い方を簡単に紹介します。

今回紹介するコード以外にもPlotlyの公式HPに多くサンプルコードが載っていますのでぜひチェックしてみてください。

plotly.com

 

2. コード

import numpy as np
import pandas as pd
import plotly.graph_objects as go

# データを用意する
x = np.arange(-10, 10, 0.1) # x軸を作成
y = np.arange(-10, 10, 0.1) # y軸を作成
X, Y = np.meshgrid(x, y)    # グリッドデータの作成
Z=np.sqrt((np.square(X)+np.square(Y))) #Z軸を作成

# 図を入れる入れ物の作成
fig = go.Figure()

# Surface図を作る
fig = go.Figure(data=go.Surface(
                   z=Z,
                   x=x,
                   y=y,
                   colorscale='jet',
                   ))

# 図のレイアウトの調整
fig.update_layout(
    width=800,
    height=700,
    #autosize=True,
    margin=dict(t=0, b=0, l=0, r=0),
    template="plotly_white",
)

# 3次元図のアスペクト比
fig.update_scenes(
    aspectratio=dict(x=1, y=1, z=1),
    aspectmode="manual"
)

# ボタンの設定と図の種類
fig.update_layout(
    updatemenus=[
        dict(
            type = "buttons",
            direction = "left",
            buttons=list([
                dict(
                    args=["type", "surface"],
                    label="3D Surface",
                    method="restyle"
                ),
                dict(
                    args=["type", "heatmap"],
                    label="Heatmap",
                    method="restyle"
                ),
                dict(
                    args=["type", "contour"],
                    label="Contour",
                    method="restyle"
                ),
                dict(
                    args=["colorscale", "Viridis"],
                    label="Viridis",
                    method="restyle"
                ),
                dict(
                    args=["colorscale", "Cividis"],
                    label="Cividis",
                    method="restyle"
                )
            
            ]),
            pad={"r": 10, "t": 10},
            showactive=True,
            x=0.1,
            xanchor="left",
            y=1.1,
            yanchor="top"
        ),
    ]
)

# 左上のテキスト
fig.update_layout(
    annotations=[
        dict(text="Trace type:", showarrow=False,
                             x=0, y=1.08, yref="paper", align="left")
    ]
)

fig.show()

上記を実行すると記事冒頭のように3Dグラフを動かしたり、2Dと3Dを切り替えたりできます。

 

3. 説明

3.1 前準備

Plotlyをインストールしておいてください。私は、M1 macでMiniforgeを使っているので、ターミナルから以下コマンドを打ってインストールしました。

conda install plotly

また"import ~~"の部分と、"#データを用意する"の以下部分は省略します。

 

3.2 グラフの作成

グラフは以下コード部分で作成しています。"Surface"は面のある3Dグラフのことです。またcolorscaleは赤と青のグラデーションの"jet"を使っています。それ以外は、図の大きさをwidthやheightで調整したり、図のアスペクトを指定しています。

# 図を入れる入れ物の作成
fig = go.Figure()

# Surface図を作る
fig = go.Figure(data=go.Surface(
                   z=Z,
                   x=x,
                   y=y,
                   colorscale='jet',
                   ))

# 図のレイアウトの調整
fig.update_layout(
    width=800,
    height=700,
    #autosize=True,
    margin=dict(t=0, b=0, l=0, r=0),
    template="plotly_white",
)

# 3次元図のアスペクト比
fig.update_scenes(
    aspectratio=dict(x=1, y=1, z=1),
    aspectmode="manual"
)

 

3.2 図の変更
                dict(
                    args=["type", "surface"],
                    label="3D Surface",
                    method="restyle"
                ),

このdictの部分でグラフを追加しています。args=["type", "(グラフ種類)"]のグラフ種類のところに例えば、

surface→面付きの3Dグラフ

heatmap→3DグラフをZ方向に(上から)見た2Dグラフ、色がZ値になる

contor→heatmapに更にコンター(データー内で同じ値に沿って結んだ線)をつけた図

と指定すれば様々なグラフを作ることができます。まだまだ種類があるのでぜひ公式HPをご確認ください。

 

3.3 色の変更
                dict(
                    args=["colorscale", "Viridis"],
                    label="Viridis",
                    method="restyle"
                ),

argsの中を"colorscale"にすると色を変えることもできます。例えばjetからViridisにすると暗い色になります。

 

4. おすすめ参考書

PyAutoGUIやOpenCVの使用方法が載っている書籍を紹介します。

この3つは非常に丁寧に書かれているのでお勧めです。

Pythonで始めるOpenCV入門

Pythonで始めるOpenCV入門

 

Pythonで始めるOpenCV入門」については、Amazonの月額読み放題サービス「Kindle unlimited」に加入していれば読み放題です。

初回30日間は無料、退会も簡単なので試しに読んでみてもよさそうです。