Plotly入門編。今回は3D 散布図の描き方を見てゆきたいと思います。
Plotlyの公式サイト3D Scatter Plots in Pythonを 見ていただければわかる通り3D面グラフの説明時と同様に具体的なデータをいれて説明するようになっていません。 そのためここでは、具体的のデータをいれて説明をおこなってゆきます。
Plotly入門編。今回は3D 散布図の描き方を見てゆきたいと思います。
Plotlyの公式サイト3D Scatter Plots in Pythonを 見ていただければわかる通り3D面グラフの説明時と同様に具体的なデータをいれて説明するようになっていません。 そのためここでは、具体的のデータをいれて説明をおこなってゆきます。
以下のような科目ごとのテストの点数のデータがあります。合格者と不合格者の散布図を作成してみます。
国語 | 英語 | 数学 | 結果 |
---|---|---|---|
95 | 35 | 91 | 不合格 |
60 | 70 | 70 | 不合格 |
75 | 60 | 80 | 合格 |
90 | 88 | 30 | 不合格 |
71 | 95 | 62 | 合格 |
81 | 50 | 85 | 合格 |
38 | 85 | 88 | 不合格 |
60 | 60 | 60 | 不合格 |
71 | 68 | 71 | 合格 |
60 | 60 | 92 | 合格 |
90 | 91 | 60 | 合格 |
90 | 91 | 95 | 合格 |
50 | 91 | 50 | 不合格 |
65 | 70 | 65 | 不合格 |
いきなり全てのデータをいれると間違っていた場合の修正が大変になるため、最初の数人のデータをいれて3D 散布図を作成してみます。
# -*- coding: utf-8 -*-
import plotly.express as px
import pandas as pd
# データを作成しデータフレームに格納する
data=[[95,35,91,'不合格']
,[60,70,70,'不合格']
,[75,60,80,'合格']]
df = pd.DataFrame(data,columns=['国語','英語','数学','結果'])
# データフレームのデータを描画する
fig = px.scatter_3d(df, x='国語', y='英語', z='数学', color='結果')
fig.show()
データ部分をdataの2次元リストに入れ、df = pd.Dataframe(…)でDataFrameに変換しています。そのときにcolumnsでそれぞれの列の名前を付与しています。
あとはPlotlyExpressのscatter_sdメソッドを使ってDataFrameと、それそれの軸にDataFrameのどのカラムを割り当てるかを指定してFigureWidgitを生成します。
最後にfig.show()でグラフを描画します。
実行結果
ここでは最初の3つの点だけだったため、すべてのデータを描画してみます。
# -*- coding: utf-8 -*-
import plotly.express as px
import pandas as pd
# データを作成しデータフレームに格納する
data=[[95,35,91,'不合格']
,[60,70,70,'不合格']
,[75,60,80,'合格']
,[90,88,30,'不合格']
,[71,95,62,'合格']
,[81,50,85,'合格']
,[38,85,88,'不合格']
,[60,60,60,'不合格']
,[71,68,71,'合格']
,[60,60,92,'合格']
,[90,91,60,'合格']
,[90,91,95,'合格']
,[50,91,50,'不合格']
,[65,70,65,'不合格']]
df = pd.DataFrame(data,columns=['国語','英語','数学','結果'])
# データフレームのデータを描画する
fig = px.scatter_3d(df, x='国語', y='英語', z='数学', color='結果')
fig.show()
実行結果は以下のようになります。
実際にはこの3D散布図を見て、合格と不合格の境界がどの面にあるかを推計したりします。
DataFrameにデータを格納する部分がわかれば後は比較的理解しやすいのではないかと思います。
Graph Objectを用いる利点はPlotly Expressで表現できない部分まで細かく表現できることです。
Scatter3dメソッドを用いることでgraph_objectを用いて2D散布図と同様に3Dスペースに個々のプロットデータを表示してみます。
合格と不合格でマークを分けてみます。合格は〇、不合格は×でプロットされるようにします。
三教科の合計点により色をグラデーションで変えるようにします。
# -*- coding: utf-8 -*-
import plotly.graph_objects as go
from itertools import starmap
# 各軸のデータを作成する。
national_language=[95,60,75,90,71,81,38,60,71,60,90,90,50,65] # 国語の点数リスト
english=[35,70,60,88,95,50,85,60,68,60,91,91,91,70] # 英語の点数リスト
math=[91,70,80,30,62,85,88,60,71,92,60,95,50,65] # 数学の点数リスト
result=['不合格','不合格','合格','不合格','合格','合格','不合格','不合格','合格','合格','合格','合格','不合格','不合格'] # 合否結果
# 合否結果をマークの種類に変換
result_symbol=[ 'circle' if i=='合格' else 'x' for i in result ]
# 3教科の合計を計算
point_sum =[ i for i in starmap(lambda x,y,z: x+y+z,zip(national_language,english,math))]
# mode='makers'を指定しないと点の間に線が引かれる
fig = go.Figure(data=[go.Scatter3d(x=national_language,y=english,z=math,mode='markers',marker=dict(
size=5
,color = point_sum
,colorscale = 'Viridis'
,symbol= result_symbol
))])
fig.show()
実行結果
PlotlyExpressを用いる場合とはことなりGraph Objectsを直接操作する場合には、Graph Objectsにあう形で軸ごとのデータに分解する前処理が必要になります。データの加工や細かい指示をおこなわなければならない一方、PloglyExpressだけでは実現できない細かい内容まで調整できます。
詳しいオブションが知りたい場合にはplotly.graph_objects.Scatter3dを見てください。
今回は3D散布図を見てみました。PlotlyExpressやGraphObjectsを用いた描画方法を見てみました。PlotlyExpressはDataFrameを用いて直接グラフを描画できるため手間なくグラフ描画が可能となっています。 一方、GraphObjectsを用いた例では、データの加工など面倒ではあるものの描画を細かく制御することができます。 目的に応じて使い分けれるようになれればと思います。
Comment on this article
コメントはまだありません。
Send comments