Spaces:
Build error
Build error
| import streamlit as st | |
| st.set_page_config(page_title="Widget Exploration", page_icon=":1234:") | |
| st.sidebar.header("Widget Exploration") | |
| st.title('Widget Exploration') | |
| st.write("""In a "real" app, we probably wouldn't | |
| publish our explorations, but here it is a nice excuse to use pages here :smiley:.""") | |
| st.write("How great are you feeling right now?") | |
| sentiment_mapping = ["one", "two", "three", "four", "five"] # map to these numers | |
| selected = st.feedback("stars") | |
| if selected is not None: # make sure we have a selection | |
| st.markdown(f"You selected {sentiment_mapping[selected]} star(s).") | |
| if selected < 1: | |
| st.markdown('Sorry to hear you are so sad :(') | |
| elif selected < 3: | |
| st.markdown('A solid medium is great!') | |
| else: | |
| st.markdown('Fantastic you are having such a great day!') | |
| st.subheader('Radio Buttons') | |
| st.markdown(""" | |
| Let's try out a [radio button](https://docs.streamlit.io/develop/api-reference/widgets/st.radio) example. | |
| """) | |
| favoriteViz = st.radio( | |
| "What's your visualization tool so far?", | |
| [":rainbow[Streamlit]", "vega-lite :sparkles:", "matplotlib :material/Home:"], | |
| captions=[ | |
| "New and cool!", | |
| "So sparkly.", | |
| "Familiar and comforting.", | |
| ], | |
| ) | |
| if favoriteViz == ":rainbow[Streamlit]": | |
| st.write("You selected Streamlit!") | |
| else: | |
| st.write("You didn't select Streamlit but that's ok, Data Viz still likes you :grin:") | |
| st.header('Connecting Plots and Widgets') | |
| import pandas as pd | |
| import numpy as np | |
| import matplotlib.pyplot as plt | |
| from io import BytesIO | |
| df = pd.read_csv("https://raw.githubusercontent.com/UIUC-iSchool-DataViz/is445_data/main/mobility.csv") | |
| # vertical alignment so they end up side by side | |
| fig_col2, controls_col2 = st.columns([2,1], vertical_alignment='center') | |
| bins = np.linspace(df['Student_teacher_ratio'].min(),df['Student_teacher_ratio'].max(), 10) | |
| table = df.pivot_table(index='State', columns=pd.cut(df['Student_teacher_ratio'], bins), aggfunc='size') | |
| # multi-select | |
| states_selected2 = controls_col2.multiselect('Which states do you want to view?', | |
| table.index.values)#, key='unik1155') | |
| # had to pass unique key to have double widgets with same value | |
| # range slider -- added | |
| student_teacher_ratio_range = controls_col2.slider("Range of student teacher ratio:", | |
| df['Student_teacher_ratio'].min(), | |
| df['Student_teacher_ratio'].max(), | |
| (0.25*df['Student_teacher_ratio'].mean(), | |
| 0.75*df['Student_teacher_ratio'].mean())) | |
| # note all the "2's" here, probably will just update the original one | |
| if len(states_selected2) > 0: # here we set a default value for the slider, so no need to have a tag | |
| min_range = student_teacher_ratio_range[0] # added | |
| max_range = student_teacher_ratio_range[1] # added | |
| df_subset2 = df[(df['State'].isin(states_selected2)) & (df['Student_teacher_ratio'] >= min_range) & (df['Student_teacher_ratio']<=max_range)] # changed | |
| # just 10 bins over the full range --> changed | |
| bins2 = 10 #np.linspace(df['Student_teacher_ratio'].min(),df['Student_teacher_ratio'].max(), 10) | |
| # make pivot table -- changed | |
| table_sub2 = df_subset2.pivot_table(index='State', | |
| columns=pd.cut(df_subset2['Student_teacher_ratio'], bins2), | |
| aggfunc='size') | |
| base_size = 4 | |
| fig2,ax2 = plt.subplots(figsize=(base_size,2*base_size)) # this changed too for different size | |
| extent2 = [df_subset2['Student_teacher_ratio'].min(), | |
| df_subset2['Student_teacher_ratio'].max(), | |
| 0, len(table_sub2.index)] | |
| ax2.imshow(table_sub2.values, cmap='hot', interpolation='nearest', extent=extent2) | |
| ax2.set_yticks(range(len(table_sub2.index))) | |
| ax2.set_yticklabels(table_sub2.index) | |
| #ax2.set_xticklabels() | |
| buf2 = BytesIO() | |
| fig2.tight_layout() | |
| fig2.savefig(buf2, format="png") | |
| fig_col2.image(buf2, width = 400) # changed here to fit better | |
| else: | |
| min_range = student_teacher_ratio_range[0] # added | |
| max_range = student_teacher_ratio_range[1] # added | |
| df_subset2 = df[(df['Student_teacher_ratio'] >= min_range) & (df['Student_teacher_ratio']<=max_range)] # changed | |
| # just 10 bins over the full range --> changed | |
| bins2 = 10 #np.linspace(df['Student_teacher_ratio'].min(),df['Student_teacher_ratio'].max(), 10) | |
| # make pivot table -- changed | |
| table_sub2 = df_subset2.pivot_table(index='State', | |
| columns=pd.cut(df_subset2['Student_teacher_ratio'], bins2), | |
| aggfunc='size') | |
| base_size = 4 | |
| fig2,ax2 = plt.subplots(figsize=(base_size,2*base_size)) # this changed too for different size | |
| extent2 = [df_subset2['Student_teacher_ratio'].min(), | |
| df_subset2['Student_teacher_ratio'].max(), | |
| 0, len(table_sub2.index)] | |
| ax2.imshow(table_sub2.values, cmap='hot', interpolation='nearest', extent=extent2) | |
| ax2.set_yticks(range(len(table_sub2.index))) | |
| ax2.set_yticklabels(table_sub2.index) | |
| #ax2.set_xticklabels() | |
| buf2 = BytesIO() | |
| fig2.tight_layout() | |
| fig2.savefig(buf2, format="png") | |
| fig_col2.image(buf2, width = 400) # changed here to fit better |