dotBlood / app.py
kedimestan's picture
Update app.py
b13bccc verified
raw
history blame
2.23 kB
import gradio as gr
import pandas as pd
from vega_datasets import data
def update_dropdowns(csv_file):
if csv_file is None:
return gr.Dropdown(choices=[]), gr.Dropdown(choices=[])
df = pd.read_csv(csv_file.name)
numeric_cols = df.select_dtypes(include=['number']).columns.tolist()
return gr.Dropdown(choices=numeric_cols), gr.Dropdown(choices=numeric_cols)
def plot_selection(selection, df):
if selection is None or df is None:
return pd.DataFrame()
return df.iloc[[i["index"] for i in selection]]
def create_scatter_plot(csv_file, x_col, y_col):
if csv_file is None or x_col is None or y_col is None:
return None, None
df = pd.read_csv(csv_file.name)
plot = gr.ScatterPlot(
value=df,
x=x_col,
y=y_col,
title="Custom CSV Scatter Plot",
x_title=x_col,
y_title=y_col,
tooltip=df.columns.tolist(),
color_legend_title="Values",
interactive=True,
brush_radius=5 # Lasso/polygon seçim için
)
return plot, df
with gr.Blocks() as app:
gr.Markdown("## 📊 Custom CSV Scatter Plot with Selection")
with gr.Row():
csv_upload = gr.UploadButton(label="Upload CSV", file_types=[".csv"])
x_axis = gr.Dropdown(label="X Axis Column")
y_axis = gr.Dropdown(label="Y Axis Column")
with gr.Row():
plot = gr.ScatterPlot(interactive=True, brush_radius=5)
selected_data = gr.DataFrame(label="Selected Points")
df_store = gr.State()
# CSV yüklendiğinde dropdown'ları güncelle
csv_upload.upload(
fn=update_dropdowns,
inputs=csv_upload,
outputs=[x_axis, y_axis]
)
# Eksenler seçildiğinde grafiği oluştur
x_axis.change(
fn=create_scatter_plot,
inputs=[csv_upload, x_axis, y_axis],
outputs=[plot, df_store]
)
y_axis.change(
fn=create_scatter_plot,
inputs=[csv_upload, x_axis, y_axis],
outputs=[plot, df_store]
)
# Seçim yapıldığında verileri güncelle
plot.select(
fn=plot_selection,
inputs=df_store,
outputs=selected_data
)
if __name__ == "__main__":
app.launch()