Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import pandas as pd | |
| import plotly.express as px | |
| import io | |
| # Page configuration | |
| st.set_page_config( | |
| page_title="Excel Graph Generator", | |
| page_icon="π", | |
| layout="wide" | |
| ) | |
| # Style input fields with black text and Times New Roman | |
| st.markdown(""" | |
| <style> | |
| * { | |
| font-family: 'Times New Roman', Times, serif !important; | |
| } | |
| .stTextInput input { | |
| color: black !important; | |
| font-family: 'Times New Roman', Times, serif !important; | |
| } | |
| .stSelectbox select { | |
| color: black !important; | |
| font-family: 'Times New Roman', Times, serif !important; | |
| } | |
| .stMultiSelect select { | |
| color: black !important; | |
| font-family: 'Times New Roman', Times, serif !important; | |
| } | |
| </style> | |
| """, unsafe_allow_html=True) | |
| # Title and description | |
| st.title('π Excel Graph Generator') | |
| st.write('Upload your Excel file and create customized graphs with ease!') | |
| # File upload | |
| uploaded_file = st.file_uploader("Upload Excel File", type=['xlsx', 'xls']) | |
| if uploaded_file: | |
| # Read Excel file | |
| df = pd.read_excel(uploaded_file) | |
| # Show data preview | |
| st.subheader("Data Preview") | |
| st.dataframe(df.head()) | |
| # Column selection | |
| st.subheader("Select Data for Plotting") | |
| x_column = st.selectbox("Select X-axis column (Date)", df.columns) | |
| y_columns = st.multiselect("Select Y-axis column(s)", [col for col in df.columns if col != x_column]) | |
| if y_columns: | |
| # Graph customization | |
| st.subheader("Customize Your Graph") | |
| # Basic settings | |
| plot_title = st.text_input("Enter Plot Title", "My Custom Graph") | |
| x_axis_label = st.text_input("X-axis Label", x_column) | |
| y_axis_label = st.text_input("Y-axis Label", "Values") | |
| # Font size customization | |
| st.subheader("Font Size Customization") | |
| title_font_size = st.slider("Title Font Size", 10, 40, 20) | |
| axis_label_font_size = st.slider("Axis Label Font Size", 8, 30, 14) | |
| tick_font_size = st.slider("Tick Label Font Size", 8, 24, 10) | |
| legend_font_size = st.slider("Legend Font Size", 8, 24, 12) | |
| # Legend position controls | |
| st.subheader("Legend Position Control") | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| legend_x = st.slider("Legend X Position", -0.5, 2.0, 1.05, 0.05) | |
| with col2: | |
| legend_y = st.slider("Legend Y Position", -0.5, 2.0, 1.0, 0.05) | |
| # Define vibrant colors | |
| default_colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEEAD', | |
| '#FF9F1C', '#E71D36', '#2EC4B6', '#011627'] | |
| # Color customization | |
| st.subheader("Color Customization") | |
| use_custom_colors = st.checkbox("Use custom colors for lines") | |
| custom_colors = {} | |
| if use_custom_colors: | |
| for i, col in enumerate(y_columns): | |
| default_color = default_colors[i % len(default_colors)] | |
| custom_colors[col] = st.color_picker(f"Color for {col}", default_color) | |
| # Legend customization | |
| st.subheader("Customize Legend Names") | |
| legend_names = {} | |
| for col in y_columns: | |
| legend_names[col] = st.text_input(f"Legend name for {col}", col) | |
| # Generate plot | |
| if st.button("Generate Graph"): | |
| # Convert date column to datetime | |
| df[x_column] = pd.to_datetime(df[x_column]) | |
| # Choose colors based on user selection | |
| if use_custom_colors: | |
| colors_to_use = [custom_colors[col] for col in y_columns] | |
| else: | |
| colors_to_use = default_colors[:len(y_columns)] | |
| # Create figure with selected colors | |
| fig = px.line(df, x=x_column, y=y_columns, | |
| color_discrete_sequence=colors_to_use) | |
| # Update legend names and hover template with date and time | |
| for i, trace in enumerate(fig.data): | |
| trace.name = legend_names[y_columns[i]] | |
| trace.hovertemplate = f"{legend_names[y_columns[i]]}: %{{y}}<br>{x_axis_label}: %{{x|%d-%m-%Y %H:%M:%S}}<extra></extra>" | |
| # Layout updates with Times New Roman and black text | |
| fig.update_layout( | |
| title=dict( | |
| text=plot_title, | |
| x=0.5, | |
| xanchor='center', | |
| yanchor='top', | |
| font=dict(family="Times New Roman", color="black", size=title_font_size) | |
| ), | |
| showlegend=True, | |
| legend=dict( | |
| orientation="v", | |
| yanchor="top", | |
| y=legend_y, | |
| xanchor="right", | |
| x=legend_x, | |
| bgcolor="white", | |
| bordercolor="Black", | |
| borderwidth=1, | |
| font=dict(family="Times New Roman", color="black", size=legend_font_size), | |
| title=dict(text="") | |
| ), | |
| hovermode='x unified', | |
| plot_bgcolor='white', | |
| paper_bgcolor='white', | |
| xaxis=dict( | |
| showgrid=True, | |
| gridwidth=1, | |
| gridcolor='LightGray', | |
| showline=True, | |
| linewidth=1, | |
| linecolor='black', | |
| mirror=True, | |
| tickangle=-90, | |
| title_text=x_axis_label, | |
| title_font=dict(family="Times New Roman", color="black", size=axis_label_font_size), | |
| tickfont=dict(family="Times New Roman", color="black", size=tick_font_size), | |
| type='date', | |
| tickformat='%d-%m-%Y', | |
| dtick='D1', | |
| tickmode='linear' | |
| ), | |
| yaxis=dict( | |
| showgrid=True, | |
| gridwidth=1, | |
| gridcolor='LightGray', | |
| showline=True, | |
| linewidth=1, | |
| linecolor='black', | |
| mirror=True, | |
| title_text=y_axis_label, | |
| title_font=dict(family="Times New Roman", color="black", size=axis_label_font_size), | |
| tickfont=dict(family="Times New Roman", color="black", size=tick_font_size) | |
| ), | |
| margin=dict(l=80, r=150, t=100, b=100), | |
| width=900, | |
| height=600, | |
| shapes=[ | |
| dict( | |
| type='rect', | |
| xref='paper', | |
| yref='paper', | |
| x0=0, | |
| y0=0, | |
| x1=1, | |
| y1=1, | |
| line=dict( | |
| color='black', | |
| width=2, | |
| ) | |
| ) | |
| ], | |
| font=dict(family="Times New Roman") | |
| ) | |
| # Display plot | |
| st.plotly_chart(fig, use_container_width=True) | |
| # Download options | |
| buffer = io.StringIO() | |
| fig.write_html(buffer) | |
| st.download_button( | |
| label="π Download Plot", | |
| data=buffer.getvalue(), | |
| file_name="plot.html", | |
| mime="text/html" | |
| ) | |
| # Footer | |
| st.markdown("---") | |
| st.markdown(""" | |
| ### π Features: | |
| - Excel file upload and preview | |
| - Times New Roman font throughout | |
| - Black text for all elements | |
| - Clean legend display with custom names | |
| - Customizable plot title, axes labels, and legend names | |
| - Custom color selection for each line | |
| - Adjustable font sizes for all text elements | |
| - Interactive legend positioning with precise controls | |
| - Interactive plot with hover details | |
| - Download options in HTML format | |
| """ | |
| """ | |
| ### π For Support And Assistance: | |
| Contact: | |
| - Harshitha Gunnam | |
| gunnamharshitha2@gmail.com | |
| - Varun Ravichander | |
| varunravichander2007@gmail.com | |
| """) | |