pbkhxj / app.py
sth4nth's picture
Upload app.py with huggingface_hub
f8b04a8 verified
import os
import gradio as gr
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import torch
import random
from datetime import datetime
# Set seed for reproducibility
random.seed(42)
np.random.seed(42)
torch.manual_seed(42)
# Data generation functions
def generate_sample_data():
dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
values = np.random.normal(100, 15, len(dates)) + np.sin(np.arange(len(dates)) * 0.1) * 30
return pd.DataFrame({
'date': dates,
'value': values,
'category': np.random.choice(['A', 'B', 'C'], len(dates))
})
def generate_line_chart(df, title="Time Series Data"):
fig, ax = plt.subplots(figsize=(12, 6))
ax.plot(df['date'], df['value'], marker='', linewidth=2, color='#3366CC')
ax.set_title(title, fontsize=16)
ax.set_xlabel('Date', fontsize=12)
ax.set_ylabel('Value', fontsize=12)
ax.grid(True, alpha=0.3)
fig.tight_layout()
return fig
def generate_pie_chart(df, title="Category Distribution"):
category_counts = df['category'].value_counts()
fig, ax = plt.subplots(figsize=(8, 8))
ax.pie(category_counts, labels=category_counts.index, autopct='%1.1f%%',
colors=['#3366CC', '#DC3912', '#FF9900'], startangle=90)
ax.set_title(title, fontsize=16)
fig.tight_layout()
return fig
def generate_bar_chart(df, title="Monthly Averages"):
df['month'] = df['date'].dt.month_name()
monthly_avg = df.groupby('month')['value'].mean().reindex([
'January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December'
])
fig, ax = plt.subplots(figsize=(12, 6))
bars = ax.bar(monthly_avg.index, monthly_avg.values, color='#3366CC')
# Add value labels on top of each bar
for bar in bars:
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width()/2., height + 1,
f'{height:.1f}', ha='center', va='bottom', fontsize=9)
ax.set_title(title, fontsize=16)
ax.set_xlabel('Month', fontsize=12)
ax.set_ylabel('Average Value', fontsize=12)
plt.xticks(rotation=45, ha='right')
fig.tight_layout()
return fig
# Image processing functions
def apply_filter(image, filter_type):
img = np.array(image)
if filter_type == "Grayscale":
# Convert to grayscale
if len(img.shape) == 3 and img.shape[2] == 3: # Ensure it's an RGB image
return Image.fromarray(np.dot(img[...,:3], [0.2989, 0.5870, 0.1140]).astype(np.uint8))
return image
elif filter_type == "Sepia":
# Apply sepia filter
if len(img.shape) == 3 and img.shape[2] == 3: # Ensure it's an RGB image
sepia_filter = np.array([
[0.393, 0.769, 0.189],
[0.349, 0.686, 0.168],
[0.272, 0.534, 0.131]
])
sepia_img = np.clip(np.dot(img[...,:3], sepia_filter.T), 0, 255).astype(np.uint8)
return Image.fromarray(sepia_img)
return image
elif filter_type == "Negative":
# Create negative
return Image.fromarray(255 - img)
elif filter_type == "Blur":
# Simple blur using PIL
from PIL import ImageFilter
return image.filter(ImageFilter.GaussianBlur(radius=3))
else:
return image
# Define theme
theme = gr.themes.Soft(
primary_hue="indigo",
secondary_hue="blue",
neutral_hue="gray"
)
# Main application
def create_dashboard():
sample_data = generate_sample_data()
with gr.Blocks(theme=theme) as app:
gr.Markdown("# Interactive Data Visualization & Image Processing Dashboard")
with gr.Tab("Data Visualization"):
gr.Markdown("### Explore sample time series data with various visualizations")
with gr.Row():
with gr.Column(scale=1):
refresh_btn = gr.Button("Generate New Data")
custom_title = gr.Textbox(label="Chart Title", value="Time Series Analysis")
with gr.Column(scale=3):
with gr.Tabs():
with gr.TabItem("Line Chart"):
line_chart = gr.Plot(label="Time Series Line Chart")
with gr.TabItem("Bar Chart"):
bar_chart = gr.Plot(label="Monthly Average Bar Chart")
with gr.TabItem("Pie Chart"):
pie_chart = gr.Plot(label="Category Distribution")
def update_charts(title):
data = generate_sample_data()
return {
line_chart: generate_line_chart(data, title if title else "Time Series Data"),
bar_chart: generate_bar_chart(data, title if title else "Monthly Averages"),
pie_chart: generate_pie_chart(data, title if title else "Category Distribution")
}
refresh_btn.click(fn=update_charts, inputs=[custom_title], outputs=[line_chart, bar_chart, pie_chart])
custom_title.change(fn=update_charts, inputs=[custom_title], outputs=[line_chart, bar_chart, pie_chart])
with gr.Tab("Image Processing"):
gr.Markdown("### Apply filters to your images")
with gr.Row():
with gr.Column():
input_image = gr.Image(label="Upload Image", type="pil")
filter_type = gr.Radio(
["Original", "Grayscale", "Sepia", "Negative", "Blur"],
label="Select Filter",
value="Original"
)
apply_btn = gr.Button("Apply Filter")
with gr.Column():
output_image = gr.Image(label="Filtered Image", type="pil")
def process_image(image, filter_choice):
if image is None:
return None
if filter_choice == "Original":
return image
return apply_filter(image, filter_choice)
apply_btn.click(fn=process_image, inputs=[input_image, filter_type], outputs=output_image)
filter_type.change(fn=process_image, inputs=[input_image, filter_type], outputs=output_image)
with gr.Tab("About"):
gr.Markdown(f"""
## About this Application
This is a demo dashboard showcasing Gradio's capabilities for creating interactive data visualization and image processing applications.
### Features:
- **Data Visualization**: Generate and explore random time series data with line charts, bar charts, and pie charts
- **Image Processing**: Apply various filters to your images
### Technologies:
- Built with Python and Gradio
- Uses Matplotlib for data visualization
- PIL for image processing
Created on: {datetime.now().strftime("%B %d, %Y")}
""")
# Initialize charts on page load
app.load(
fn=update_charts,
inputs=[custom_title],
outputs=[line_chart, bar_chart, pie_chart],
)
return app
if __name__ == '__main__':
dashboard = create_dashboard()
dashboard.launch()
if __name__ == '__main__':
demo.launch()