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()