🙄

python 3Dplot memo

に公開

半年置きにくらいに3Dplotを使いたくなる。
x-yの2Dプロットじゃなく、x-y-zの3要素の依存関係有無を確認したい。
でも、半年も立つと、いつもどこに書いたのか忘れてるのでここに書いておく。

'''python

import pandas as pd
import plotly.graph_objects as go
import plotly.io as pio
from sklearn.preprocesing import StandardScaler
import datetime

Plotlyのレンダラー

pio.renderers.default = "browser"

now = datetime.datetime.now()
current_time = now.strftime("%H:%M:%S")
print("開始時刻 ", current_time)

df_org = pd.read_csv(r"C:\hoge\dataset.csv") # DataSet指定

def plot3D(df, x, y, z, target, output_dir):

# 標準化
scaler = StandardScale()
df_scaled = pd.DataFrame(scaler.fit_transform(df[[x, y, z]]),
    columns=[x, y, z]])
df = df_scaled

# 軽くするためのサンプリング
sample_size = min(100000, len(df))
df_sample = df.sample(n=sample_size, replace=True, random_state=42)

# 3D plotting
fig = go.Figure(data=[go.Scatter3d(
    x=df_sample[x],
    y=df_sample[y],
    z=df_sample[z],
    mode='markers',
    marker=dict(
        size=2
        color=df_sample[z],
        colorscale='Viridis',
        opacity=0.8
    )
)])

# レイアウトの設定
fig.update_layout(
    scene=dict(
        xaxis_title=x,
        yaxis_title=y,
        zaxis_title=z

aspectmode='data'

        aspectmode='manual',
        aspectratio=dict(x=2, y=3, z=2)
    ),
    width = 1000,
    height = 1000,
    title ='3D Scatter Plot'
    scene_dragmode='orbit' # マウスでの回転を有効化
)

file_name = f"{output_dir}\\plotly_3D_{target}.html"
fig.write_html(file_name)

以下、body

DiscB

必要なData列(目的変数または説明変数)のみを選択

df = df_org[['target1', 'target2', 'exp_var1', 'exp_var2', 'exp_var3', 'exp_var4',
'OHE_var1', 'OHE_var2', 'OHE_var3', 'OHE_var4']]
df_DiscBVar4 = df[df['OHE_var4'] == 1]
x = 'exp_var1'
y = 'exp_var2'
z = 'target1'
output_dir = r"C:\hoge2" # 出力dirを指定
target = 'DiscBVar4'
plot3D(df_DiscBVar4, x, y, z, target, out_dir)

DiscC

必要なData列(目的変数または説明変数)のみを選択

df = df_org[['target1', 'target2', 'exp_var1', 'exp_var2', 'exp_var3', 'exp_var4',
'OHE_var1', 'OHE_var2', 'OHE_var3', 'OHE_var4']]
df_DiscCVar1 = df[df['OHE_var1'] == 1]
x = 'exp_var3'
y = 'exp_var4'
z = 'target2'
output_dir = r"C:\hoge2" # 出力dirを指定
target = 'DiscCVar1'
plot3D(df_DiscCVar1, x, y, z, target, out_dir)

now = datetime.datetime.now()
current_time = now.strftime("%H:%M:%S")
print("終了時刻 ", current_time)

'''

Discussion