streamlit2



```python

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()
```