import streamlit as st from data_processor import load_data, process_data from visualizer import visualize_gmm, visualize_ratings from hypergraph_drawer import draw_hypergraph # 设置页面配置 st.set_page_config(layout="wide") # 主应用 def main(): st.title("高斯混合分布聚类可视化") # 使用 sidebar 控制参数 with st.sidebar: st.header("控制面板") autoplay = st.button("自动播放") if autoplay: for i in range(1, 11): with st.spinner(f"迭代 {i}"): time.sleep(1) st.session_state.iteration = i st.session_state.autoplay = False st.experimental_rerun() # 主页面布局 if 'autoplay' not in st.session_state: st.session_state.autoplay = True if 'iteration' not in st.session_state: st.session_state.iteration = 1 if st.session_state.autoplay: # 隐藏迭代次数滑条 iteration = st.session_state.iteration else: # 显示迭代次数滑条 iteration = st.slider("选择迭代次数", min_value=1, max_value=10, value=st.session_state.iteration, step=1) # 动态限制采样数量的最大值 df = load_data() max_samples = len(df) num_samples = st.slider("选择采样论文数量", min_value=1, max_value=min(100, max_samples), value=min(10, max_samples), step=1) # 处理数据 sampled_df, probabilities, hyperedges = process_data(df, iteration, num_samples) # 并排展示超图和高斯混合分布 col1, col2 = st.columns(2) with col1: st.header("超图可视化") hypergraph_image = draw_hypergraph(hyperedges) st.image(hypergraph_image, caption="超图可视化", use_container_width=True) with col2: st.header("高斯混合分布聚类结果") fig_gmm = visualize_gmm(sampled_df, iteration) st.plotly_chart(fig_gmm, use_container_width=True) # 显示采样论文的详细信息 st.header("采样论文详细信息") st.dataframe(sampled_df[["title", "keywords", "rating_avg", "confidence_avg", "site"]]) # 增加第二种可视化方式 st.header("论文评分分布") fig_bar = visualize_ratings(sampled_df) st.plotly_chart(fig_bar, use_container_width=True) if __name__ == "__main__": main()