import streamlit as st
import pandas as pd
from pathlib import Path
import plotly.graph_objects as go
import plotly.express as px
def main():
# ページ設定
st.set_page_config(layout="wide")
# 本文
st.header('3D viz')
st.write('Powerd by Plotly')
uploaded_file = st.file_uploader("Excelファイルをアップロードしてください", type=["xlsx", "xls"])
if uploaded_file is not None:
try:
df = pd.read_excel(uploaded_file)
st.success("ファイルが正常に読み込まれました。")
st.write(df)
except Exception as e:
st.error(f"エラー: {e}")
# col1, col2 = st.columns(2)
col1, col2 = st.columns([2, 1])
with col1:
with st.expander("設定画面", expanded=True):
# 表示・非表示をトグルで制御
text_toggle = st.toggle(label='ラベルを表示する')
with st.expander("フィルター条件", expanded=True):
# データ取得処理(stの変数に応じてデータ取得後にフィルタリングする)
df1 = pd.read_excel('positions.xlsx')
# 選択した条件でフィルター
selected_group_list = st.multiselect('左の条件でフィルターします',options=['GroupA', 'GroupB'], default=['GroupA'])
with col2:
pass
with st.expander("3D plot", expanded=True):
# 3D散布図を作成
fig2 = px.scatter_3d(df1, x='X', y='Y', z='Z',
color='mass',
symbol='category',
size='mass',
color_continuous_scale=['grey', 'red'],
text='name' if text_toggle else None,
)
fig2.update_layout(showlegend=False)
# シンボルを全てのデータポイントに円に設定
fig2.update_traces(marker=dict(symbol='circle'))
# カラーバーの設定
fig2.update_layout(coloraxis_colorbar=dict(title='Mass'))
fig2.update_layout(legend_orientation="h")
# マーカーサイズ設定
# fig.update_traces(marker_size=5)
# 原点にX軸方向の矢印を追加
fig2.add_trace(go.Cone(x=[0, 100], y=[0, 0], z=[0, 0], showscale=False, colorscale='Blues', hoverinfo='skip'))
# 原点にY軸方向の矢印を追加
fig2.add_trace(go.Cone(x=[0, 0], y=[0, 100], z=[0, 0], showscale=False, colorscale='Reds', hoverinfo='skip'))
# 原点にZ軸方向の矢印を追加
fig2.add_trace(go.Cone(x=[0, 0], y=[0, 0], z=[0, 100], showscale=False, colorscale='Greens', hoverinfo='skip'))
# 3Dサーフェス1を追加
fig2.add_trace(go.Mesh3d(x=[0, 50, 0, 50],
y=[0, 0, 50, 50],
z=[0, 0, 0, 0],
opacity=0.5,
color='rgba(0, 0, 255, 0.8)', # RGB値を変更して色を濃くする
hoverinfo='skip' # ホバー表示を無効化
))
# 3Dサーフェス2を追加
fig2.add_trace(go.Mesh3d(x=[0, 50, 0, 50],
y=[0, 0, 50, 50],
z=[100, 100, 100, 100],
opacity=0.5,
color='rgba(0, 0, 255, 0.8)', # RGB値を変更して色を濃くする
hoverinfo='skip' # ホバー表示を無効化
))
# 3Dサーフェス3を追加
fig2.add_trace(go.Mesh3d(
# メッシュの頂点を指定
x=[0, 0, 0, 0],
y=[0, 50, 50, 0],
z=[0, 0, 50, 50],
# メッシュ各面を構成するインデックスを指定
# 0,1,2番目の頂点からなる三角ポリゴンと0,2,3番目の頂点からなる三角ポリゴンの2つに分けて描画
i=[0, 0],
j=[1, 2],
k=[2, 3],
opacity=0.5,
color='rgba(0, 0, 255, 0.8)', # RGB値を変更して色を濃くする
hoverinfo='skip' # ホバー表示を無効化
))
# X軸方向のcornを追加
fig2.add_trace(go.Cone(
x=[10], y=[0], z=[0], # 始点座標
u=[1], v=[0], w=[0], # X軸方向を示すベクトル
showscale=False,
colorscale='Blues',
hoverinfo='skip',
sizemode='scaled', # サイズモードをスケールモードに設定
sizeref=2 # サイズのスケールを調整
))
# Y軸方向のcornを追加
fig2.add_trace(go.Cone(
x=[0], y=[10], z=[0], # 始点座標
u=[0], v=[1], w=[0], # X軸方向を示すベクトル
showscale=False,
colorscale='reds',
hoverinfo='skip',
sizemode='scaled', # サイズモードをスケールモードに設定
sizeref=2 # サイズのスケールを調整
))
# Z軸方向のcornを追加
fig2.add_trace(go.Cone(
x=[0], y=[0], z=[10], # 始点座標
u=[0], v=[0], w=[1], # X軸方向を示すベクトル
showscale=False,
colorscale='greens',
hoverinfo='skip',
sizemode='scaled', # サイズモードをスケールモードに設定
sizeref=2 # サイズのスケールを調整
))
# X軸の線分とラベルを追加
fig2.add_trace(go.Scatter3d(
x=[0, 10], y=[0, 0], z=[0, 0],
mode='lines',
line=dict(color='blue', width=10), # 線の太さを大きくする
hoverinfo='skip',
))
fig2.add_trace(go.Scatter3d(
x=[10], y=[0], z=[0],
mode='text',
text=["X"], # テキストの内容
textposition="bottom center", # テキストの位置
textfont=dict(size=20), # テキストのサイズ
hoverinfo='skip'
))
# Y方向の線分とラベルを追加
fig2.add_trace(go.Scatter3d(
x=[0, 0], y=[0, 10], z=[0, 0],
mode='lines',
line=dict(color='red', width=10), # 線の太さを大きくする
hoverinfo='skip',
))
fig2.add_trace(go.Scatter3d(
x=[0], y=[10], z=[0],
mode='text',
text=["Y"], # テキストの内容
textposition="top center", # テキストの位置
textfont=dict(size=20), # テキストのサイズ
hoverinfo='skip'
))
# Z軸の線分とラベルを追加
fig2.add_trace(go.Scatter3d(
x=[0, 0], y=[0, 0], z=[0, 10],
mode='lines',
line=dict(color='green', width=10), # 線の太さを大きくする
hoverinfo='skip',
))
fig2.add_trace(go.Scatter3d(
x=[0], y=[0], z=[10],
mode='text',
text=["Z-axis"], # テキストの内容
textposition="bottom center", # テキストの位置
textfont=dict(size=20), # テキストのサイズ
hoverinfo='skip'
))
# レイアウトの調整
fig2.update_layout(
scene=dict(
xaxis=dict(range=[-100, 100]),
yaxis=dict(range=[-100, 100]),
zaxis=dict(range=[-100, 100])
),
width=1500, # グラフの幅と高さの設定
height=1000,
hoverlabel_font_size=20
)
# グラフの表示
st.plotly_chart(fig2, use_container_width=True)
st.divider()
st.dataframe(df1.head())
if __name__ == '__main__':
main()
More than 1 year has passed since last update.
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme