import streamlit as st import anndata as ad import pandas as pd from pathlib import Path import io # Page config st.set_page_config(page_title="AnnData Explorer", layout="wide") st.title("AnnData Explorer – X, obs, var") # Sidebar: file upload uploaded = st.sidebar.file_uploader("Upload .h5ad", type=["h5ad"]) @st.cache_data def load_adata(path_or_bytes): if isinstance(path_or_bytes, (str, Path)): return ad.read_h5ad(path_or_bytes) # UploadedFile return ad.read_h5ad(io.BytesIO(path_or_bytes.read())) if uploaded is None: st.info("Please upload an .h5ad file from the sidebar.") st.stop() adata = load_adata(uploaded) # Sidebar: dimension info st.sidebar.write("### Dataset info") st.sidebar.write(f"Cells: {adata.n_obs}") st.sidebar.write(f"Features: {adata.n_vars}") # Main area: three tables tab1, tab2, tab3 = st.tabs(["X", "obs", "var"]) with tab1: st.subheader("AnnData.X") st.dataframe( pd.DataFrame( adata.X.todense() if hasattr(adata.X, "todense") else adata.X, index=adata.obs_names, columns=adata.var_names, ), use_container_width=True, ) with tab2: st.subheader("AnnData.obs") st.dataframe(adata.obs, use_container_width=True) with tab3: st.subheader("AnnData.var") st.dataframe(adata.var, use_container_width=True)