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