PythonのPlotlyで遊んだ
0. はじめに
Plotly1 をご存知だろうか.統計や金融,科学等の幅広い分野で用いられている,データの可視化のためのライブラリであり,Python や R などで用いることができる.
Plotly を用いると,3d plot をとてもきれいにできる.今回は,Plotly を用いて適当なグラフを描画して遊ぼうと思う.
1. 準備
1.1. インストール
Python にインストールするのであれば,pip install
すればよい.
pip install plotly
1.2. プロットするもの
最適化のためのテスト関数2 の一部をプロットする.
ここでは,次の2つの関数をプロットする.
Rastrigin function
-
Definition
-
Search domain
-
Global minimum
Ackley function
-
Definition
-
Search domain
-
Global minimum
2. プロット
ここでは,3D Surface Plot を行う.コードの書き方は,3を参考にした.
実装した Python のコード
########## Packages ##########
import numpy as np
import plotly.graph_objects as go
from math import e
##############################
class Test_function():
"""
The class of test functions
"""
def rastrigin(self, x):
"""
Rastrigin function
"""
val = 10.0*x.size
for i in range(x.size):
val += x[i]**2 - 10*np.cos(2*np.pi*x[i])
return val
def ackley(self, x):
"""
Ackley function
"""
val = -20*np.exp(-0.2*(np.sqrt(0.5*(x[0]**2 + x[1]**2))))
val += -np.exp(0.5*(np.cos(2*np.pi*x[0]) + np.cos(2*np.pi*x[1])))
val += e + 20
return val
class Plot_func():
"""
The class to plot functions
"""
def func_value(self, func, x_range, y_range):
"""
get the value of the function (2 dim)
Input:
func: function
x_range, y_range: numpy linspace
Output:
X, Y: numpy meshgrid
Z: corresponding func value
"""
X, Y = np.meshgrid(x_range, y_range)
Z = np.empty_like(X)
for i in range(len(X)):
for j in range(len(X[i])):
vec_x = np.array([X[i][j], Y[i][j]])
Z[i][j] = func(vec_x)
return X, Y, Z
def plotly_surface_contour(self, func, x_range, y_range):
"""
plot the surface of the function using plotly,
https://plotly.com/python/3d-surface-plots/
"""
##### get the value of the function #####
X, Y, Z = self.func_value(func, x_range, y_range)
#########################################
##### plot #####
fig = go.Figure(data=[go.Surface(z=Z, x=X, y=Y)])
fig.update_traces(contours_z=dict(show=True, usecolormap=True,
highlightcolor="limegreen", project_z=True))
fig.update_layout(autosize=False,
scene_camera_eye=dict(x=1.87, y=0.88, z=-0.64),
width=500, height=500,
margin=dict(l=65, r=50, b=65, t=90))
fig.show()
################
##### instance of the class #####
test = Test_function()
pf = Plot_func()
#################################
##### Plot Rastrigin function #####
x = np.linspace(-5.12, 5.12, 100)
y = np.linspace(-5.12, 5.12, 100)
pf.plotly_surface_contour(
func=test.rastrigin,
x_range=x,
y_range=y)
###################################
##### Plot Ackley function #####
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
pf.plotly_surface_contour(
func=test.ackley,
x_range=x,
y_range=y)
################################
また,このコードを Jupyter notebook 形式にして html に変換したものを以下のリンクに置いている (表示に少し時間がかかる).
関数の表面がどうなっているか可視化されていて面白いと思う.また,動かすこともできるのが良い.
3. まとめ
Plotly は面白いので,詳しくなりたい.
-
plotly Graphing Libraries, accessed on 2021.9.17. ↩︎
-
Test function for optimization (en: Wikipedia), accessed on 2021.9.17. ↩︎
-
plotly Graphing Libraries, 3D Surface Plots in Python, accessed on 2021.9.17. ↩︎