| import streamlit as st |
| import pandas as pd |
| import numpy as np |
| import matplotlib.pyplot as plt |
|
|
| from plot_registry import PlotRegistry |
|
|
|
|
| |
| |
| |
| st.set_page_config( |
| page_title="Matplotlib Veri Görselleştirme Aracı", |
| layout="wide" |
| ) |
|
|
| st.title("📊 Matplotlib Tabanlı Veri Görselleştirme Aracı") |
|
|
|
|
| |
| |
| |
| def detect_columns(df: pd.DataFrame): |
| numeric = [] |
| categorical = [] |
| ignore = [] |
|
|
| for col in df.columns: |
| nunique = df[col].nunique(dropna=True) |
| ratio = nunique / max(len(df), 1) |
|
|
| if pd.api.types.is_numeric_dtype(df[col]): |
| if ratio < 0.05: |
| categorical.append(col) |
| else: |
| numeric.append(col) |
| else: |
| if ratio > 0.7: |
| ignore.append(col) |
| else: |
| categorical.append(col) |
|
|
| return numeric, categorical, ignore |
|
|
|
|
| def eda_summary(df: pd.DataFrame): |
| st.subheader("🔍 Basit EDA Özeti") |
|
|
| st.markdown("**Veri Seti**") |
| st.dataframe(df.head()) |
|
|
| c1, c2 = st.columns(2) |
|
|
| with c1: |
| st.markdown("**Veri Boyutu**") |
| st.write(df.shape) |
|
|
| st.markdown("**Eksik Değerler**") |
| st.dataframe(df.isnull().sum().to_frame("Eksik Sayısı")[df.isnull().sum() > 0]) |
|
|
| with c2: |
| st.markdown("**Sayısal Alan İstatistikleri**") |
| st.dataframe(df.describe().T) |
|
|
|
|
| |
| |
| |
| registry = PlotRegistry("app/src/plots.json") |
|
|
|
|
| |
| |
| |
| uploaded = st.file_uploader( |
| "📁 CSV / XLS / XLSX dosyası yükleyin", |
| type=["csv", "xls", "xlsx"] |
| ) |
|
|
| if not uploaded: |
| st.info("Başlamak için bir veri seti yükleyin.") |
| st.stop() |
|
|
| |
| |
| |
| if uploaded.name.endswith(".csv"): |
| df = pd.read_csv(uploaded) |
| else: |
| df = pd.read_excel(uploaded) |
|
|
| st.success("Veri başarıyla yüklendi") |
|
|
| |
| |
| |
| eda_summary(df) |
|
|
| |
| |
| |
|
|
| numeric_cols, cat_cols, ignore_cols = detect_columns(df) |
|
|
| st.subheader("🧩 Alan Türleri (Düzenlenebilir)") |
|
|
| c1, c2, c3 = st.columns(3) |
|
|
| with c1: |
| num_options = df.columns |
| num_default = [c for c in numeric_cols if c in num_options] |
|
|
| numeric_cols = st.multiselect( |
| "🔢 Sayısal Alanlar", |
| options=num_options, |
| default=num_default |
| ) |
|
|
|
|
| with c2: |
| cat_options = df.columns |
| cat_default = [c for c in cat_cols if c in cat_options] |
|
|
| cat_cols = st.multiselect( |
| "🏷️ Kategorik Alanlar", |
| options=cat_options, |
| default=cat_default |
| ) |
|
|
|
|
| with c3: |
| ignore_cols = st.multiselect( |
| "🚫 Grafik Dışı Alanlar", |
| options=df.columns, |
| default=ignore_cols |
| ) |
|
|
| usable_cols = numeric_cols + cat_cols |
|
|
|
|
| |
| |
| |
| st.divider() |
| st.subheader("📈 Grafik Seçimi") |
|
|
| groups = registry.get_groups() |
|
|
| group = st.selectbox("Grafik Grubu", groups) |
| plots = registry.get_plots_in_group(group) |
|
|
| plot_key = st.selectbox( |
| "Grafik Türü", |
| list(plots.keys()) |
| ) |
|
|
| plot_info = registry.get_plot(group, plot_key) |
|
|
| |
| |
| |
| st.info(f"**Ne zaman kullanılır?**\n\n{plot_info.get('when_to_use','')}") |
|
|
| |
| |
| |
| st.subheader("🧮 Grafik Alanları") |
|
|
| inputs = plot_info.get("inputs", []) |
|
|
| vars_selected = {} |
|
|
| for inp in inputs: |
| if inp in ["x", "y"]: |
| vars_selected[inp] = st.selectbox( |
| f"{inp.upper()} alanı", |
| options=usable_cols if inp != "y" else usable_cols |
| ) |
|
|
| |
| |
| |
| st.subheader("⚙️ Grafik Ayarları") |
|
|
| PALETTES = { |
| "Default": plt.rcParams['axes.prop_cycle'].by_key()['color'], |
| "Pastel": ["#AEC6CF", "#FFB347", "#B39EB5", "#77DD77"], |
| "Bold": ["#e41a1c", "#377eb8", "#4daf4a", "#984ea3"], |
| "Grayscale": ["#222222", "#555555", "#888888", "#BBBBBB"] |
| } |
|
|
|
|
| options = {} |
| opts = list(plot_info.get("options", {}).items()) |
| if opts: |
| cols = st.columns(len(opts)) |
| for i, (opt, default) in enumerate(opts): |
| col = cols[i % len(cols)] |
| if opt == "color": |
| palette_name = col.selectbox("🎨 Palet", PALETTES.keys()) |
| palette = PALETTES[palette_name] |
| options[opt] = col.color_picker("Tek Renk", palette[0]) |
| else: |
| options[opt] = col.text_input(opt, value=str(default) if default is not None else "") |
| else: |
| st.write("Bu grafik tipi için özelleştirilebilir ayar yok.") |
|
|
|
|
| |
| |
| |
| st.subheader("🖼️ Genel Görsel Ayarlar") |
|
|
| col1, col2 = st.columns([1, 4]) |
|
|
| with col1: |
| fig_w = st.number_input("Figür Genişliği", 4, 20, 8) |
| fig_h = st.number_input("Figür Yüksekliği", 4, 20, 5) |
|
|
| with col2: |
| title = st.text_input("Başlık", "Grafik Başlığı") |
| xlabel = st.text_input("X Etiketi", vars_selected.get("x", "")) |
| ylabel = st.text_input("Y Etiketi", vars_selected.get("y", "")) |
|
|
| |
| |
| |
| st.divider() |
| st.subheader("📊 Grafik") |
|
|
| fig, ax = plt.subplots(figsize=(fig_w, fig_h)) |
|
|
| |
| clean_options = options |
|
|
| exec_code, display_code = registry.generate_code( |
| group=group, |
| plot_key=plot_key, |
| variables={ |
| "x": f"df['{vars_selected.get('x')}']", |
| "y": f"df['{vars_selected.get('y')}']" |
| }, |
| user_options=options, |
| figsize=(fig_w, fig_h), |
| title=title, |
| xlabel=xlabel, |
| ylabel=ylabel |
| ) |
|
|
| |
| try: |
| exec(exec_code, {"df": df, "plt": plt, "ax": ax}) |
| except Exception as e: |
| st.error("Grafik oluşturulurken hata oluştu.") |
| st.exception(e) |
| else: |
| st.pyplot(fig) |
|
|
| |
| |
| |
| import io |
|
|
| buf = io.BytesIO() |
| fig.savefig(buf, format="png", dpi=300) |
| buf.seek(0) |
|
|
| st.download_button( |
| "⬇️ Grafiği PNG olarak indir", |
| data=buf, |
| file_name="grafik.png", |
| mime="image/png" |
| ) |
|
|
| |
| |
| |
| st.subheader("🐍 Python Kod Çıktısı (Notebook Uyumlu)") |
| st.code(display_code, language="python") |