0
0

streamlit2

Posted at

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0