File size: 7,360 Bytes
f8b04a8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
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() |