Python ile Veri Görselleştirme: Matplotlib, Seaborn ve Plotly Rehberi

Matplotlib 3.10, Seaborn 0.13 ve Plotly 6.5 ile Python'da veri görselleştirme rehberi. Pratik örnekler, karşılaştırma tablosu ve hangi durumda hangi kütüphaneyi kullanmalısınız?

Veriyi anlamanın en etkili yolu onu görmektir — bunu söylemek klişe gibi gelebilir ama gerçekten doğru. Binlerce satırlık bir tabloya bakıp bir şey anlamaya çalışmak (ben bunu yıllarca yaptım, inanın) neredeyse imkansız. Ama doğru bir grafik? Birkaç saniyede hikayeyi anlatır.

Python ekosistemi bu konuda şanslı sayılır. Temel altyapı için Matplotlib, istatistiksel estetik için Seaborn, interaktif deneyim için Plotly var. Her birinin güçlü ve zayıf yanları var, hangisini ne zaman kullanacağınızı bilmek gerçek farkı yaratıyor.

Bu rehberde üç kütüphaneyi de güncel sürümleriyle ele alacağız: Matplotlib 3.10, Seaborn 0.13 ve Plotly 6.5. Pratik kod örnekleri, karşılaştırmalar ve 2026 itibarıyla en iyi pratikler — hepsini burada bulacaksınız. Haydi başlayalım.

Geliştirme Ortamının Hazırlanması

Önce ortamımızı kuralım. Üç kütüphaneyi de tek seferde yükleyebilirsiniz:

pip install matplotlib seaborn plotly pandas numpy kaleido

Temel importlar ve örnek veri setimiz şöyle olacak:

import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
import plotly.graph_objects as go
import pandas as pd
import numpy as np

# Seaborn varsayılan temasını ayarlayalım
sns.set_theme(style="whitegrid")

# Örnek veri seti
np.random.seed(42)
n = 500
df = pd.DataFrame({
    "ay": np.tile(pd.date_range("2024-01", periods=12, freq="ME"), n // 12 + 1)[:n],
    "satis": np.random.lognormal(mean=10, sigma=0.4, size=n).astype(int),
    "kategori": np.random.choice(["Elektronik", "Giyim", "Gıda", "Kozmetik"], n),
    "bolge": np.random.choice(["Marmara", "Ege", "İç Anadolu", "Akdeniz"], n),
    "musteri_puani": np.random.uniform(1, 10, n).round(1),
    "iade_orani": np.random.beta(2, 8, n).round(3)
})

Bu veri seti bize yeterince çeşitlilik sağlıyor: tarih, sayısal, kategorik değişkenler hepsi mevcut. Gerçek bir e-ticaret verisine oldukça benziyor.

1. Matplotlib: Eski Tüfek Ama Hâlâ Güçlü

Matplotlib, Python veri görselleştirmesinin temel taşı. 2003'ten beri geliştiriliyor ve diğer tüm görselleştirme araçlarının (Seaborn dahil) üzerine inşa edildiği altyapıyı sağlıyor.

Esnekliği muazzam — hayal edebileceğiniz neredeyse her tür grafiği oluşturabilirsiniz. Ama açıkçası bu esneklik bazen biraz fazla kod yazmayı gerektiriyor. Basit bir grafik için bile 8-10 satır yazmak zorunda kalabilirsiniz.

1.1 Çizgi Grafiği (Line Plot)

aylik_satis = df.groupby("ay")["satis"].mean().reset_index()

fig, ax = plt.subplots(figsize=(10, 5))
ax.plot(aylik_satis["ay"], aylik_satis["satis"],
        marker="o", linewidth=2, color="#2196F3", markersize=6)
ax.set_title("Aylık Ortalama Satış Trendi", fontsize=14, fontweight="bold")
ax.set_xlabel("Ay")
ax.set_ylabel("Ortalama Satış (₺)")
ax.tick_params(axis="x", rotation=45)
ax.grid(True, alpha=0.3)
fig.tight_layout()
plt.savefig("cizgi_grafik.png", dpi=150)
plt.show()

1.2 Çoklu Alt Grafik (Subplots)

Matplotlib'in en güçlü yanlarından biri, birden fazla grafiği tek bir figürde düzenleyebilmesi. Bu özellik özellikle raporlarda ve sunumlarda çok işe yarıyor:

fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# Sol üst: Histogram
axes[0, 0].hist(df["satis"], bins=30, color="#4CAF50", edgecolor="white", alpha=0.8)
axes[0, 0].set_title("Satış Dağılımı")
axes[0, 0].set_xlabel("Satış (₺)")

# Sağ üst: Kutu grafik
kategoriler = df["kategori"].unique()
veri_listesi = [df[df["kategori"] == k]["satis"] for k in kategoriler]
bp = axes[0, 1].boxplot(veri_listesi, labels=kategoriler, patch_artist=True)
renkler = ["#FF9800", "#2196F3", "#4CAF50", "#E91E63"]
for patch, renk in zip(bp["boxes"], renkler):
    patch.set_facecolor(renk)
axes[0, 1].set_title("Kategoriye Göre Satış")

# Sol alt: Pasta grafik
kategori_toplam = df.groupby("kategori")["satis"].sum()
axes[1, 0].pie(kategori_toplam, labels=kategori_toplam.index,
               autopct="%1.1f%%", colors=renkler, startangle=90)
axes[1, 0].set_title("Kategori Satış Payları")

# Sağ alt: Saçılım grafik
axes[1, 1].scatter(df["musteri_puani"], df["satis"],
                   alpha=0.4, c=df["iade_orani"], cmap="RdYlGn_r", s=20)
axes[1, 1].set_title("Müşteri Puanı vs Satış")
axes[1, 1].set_xlabel("Müşteri Puanı")
axes[1, 1].set_ylabel("Satış (₺)")

fig.suptitle("Satış Verileri Genel Bakış", fontsize=16, fontweight="bold", y=1.02)
fig.tight_layout()
plt.savefig("subplot_ornek.png", dpi=150, bbox_inches="tight")
plt.show()

Gördüğünüz gibi kod biraz uzun ama sonuç gayet profesyonel görünüyor.

1.3 Matplotlib 3.10 Yenilikleri

Matplotlib 3.10 birkaç güzel yenilik getirdi:

  • petroff10 renk döngüsü: Renk körlüğüne uyumlu ve estetik açıdan optimize edilmiş yeni bir varsayılan renk paleti. plt.style.use("petroff10") ile etkinleştirin — bence varsayılan renklerden çok daha iyi.
  • Yeni diverging colormaps: "berlin", "managua" ve "vanimo" adlı üç yeni ayrışan renk haritası eklendi.
  • Tip ipuçları (type hints): PEP 484 uyumlu tip dosyaları sayesinde IDE'lerde daha iyi otomatik tamamlama desteği geliyor.
# Yeni petroff10 renk döngüsü
plt.style.use("petroff10")

fig, ax = plt.subplots(figsize=(10, 6))
for kategori in df["kategori"].unique():
    veri = df[df["kategori"] == kategori].groupby("ay")["satis"].mean()
    ax.plot(veri.index, veri.values, marker="o", label=kategori, linewidth=2)

ax.legend(title="Kategori")
ax.set_title("Kategoriye Göre Aylık Satış (petroff10 Renkleri)")
ax.set_ylabel("Ortalama Satış (₺)")
fig.tight_layout()
plt.show()

2. Seaborn: Az Kodla Çok İş

Seaborn, Matplotlib üzerine inşa edilmiş yüksek seviyeli bir kütüphane. Daha az kodla daha estetik ve istatistiksel açıdan anlamlı grafikler üretiyor. Keşifsel veri analizi (EDA) yapıyorsanız, Seaborn muhtemelen en çok kullanacağınız araç olacak.

Şahsen, hızlı bir analiz yapacağım zaman ilk elimi attığım kütüphane Seaborn oluyor.

2.1 Dağılım Grafikleri

# Histogram + KDE (Çekirdek Yoğunluk Tahmini)
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# Tek değişkenli dağılım
sns.histplot(data=df, x="satis", hue="kategori", kde=True,
             stat="density", common_norm=False, alpha=0.5, ax=axes[0])
axes[0].set_title("Kategoriye Göre Satış Dağılımı")

# Violin plot: dağılım + kutu grafik birleşimi
sns.violinplot(data=df, x="kategori", y="satis",
               inner="box", palette="Set2", ax=axes[1])
axes[1].set_title("Kategoriye Göre Satış (Violin Plot)")

fig.tight_layout()
plt.show()

İki satırla hem dağılımı hem KDE'yi görebiliyorsunuz. Matplotlib ile aynı sonucu elde etmek çok daha fazla kod gerektirirdi.

2.2 İlişki Grafikleri

# Saçılım + regresyon çizgisi
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# lmplot yerine regplot (tek eksen üzerinde)
sns.regplot(data=df, x="musteri_puani", y="satis",
            scatter_kws={"alpha": 0.3, "s": 15},
            line_kws={"color": "red"}, ax=axes[0])
axes[0].set_title("Müşteri Puanı vs Satış (Regresyon)")

# Isı haritası (korelasyon matrisi)
sayisal = df.select_dtypes(include=[np.number])
korelasyon = sayisal.corr()
sns.heatmap(korelasyon, annot=True, cmap="coolwarm", center=0,
            fmt=".2f", linewidths=0.5, ax=axes[1])
axes[1].set_title("Korelasyon Matrisi")

fig.tight_layout()
plt.show()

2.3 Kategorik Karşılaştırma

# Seaborn 0.13'ün geliştirilmiş kategorik fonksiyonları
fig, axes = plt.subplots(1, 3, figsize=(18, 5))

# Çubuk grafik (ortalama + güven aralığı)
sns.barplot(data=df, x="kategori", y="satis",
            hue="bolge", palette="viridis",
            errorbar="ci", ax=axes[0])
axes[0].set_title("Kategori × Bölge Satış Ortalaması")
axes[0].tick_params(axis="x", rotation=30)

# Swarm plot (tüm veri noktaları)
sns.swarmplot(data=df.sample(100), x="kategori", y="musteri_puani",
              hue="bolge", palette="Set2", size=4, ax=axes[1])
axes[1].set_title("Müşteri Puanı Dağılımı")

# Strip plot
sns.stripplot(data=df.sample(200), x="bolge", y="iade_orani",
              hue="kategori", dodge=True, alpha=0.6,
              palette="tab10", ax=axes[2])
axes[2].set_title("İade Oranı Dağılımı")

fig.tight_layout()
plt.show()

Güven aralıklarının otomatik olarak eklenmesine dikkat edin — Seaborn bunu sizin yerinize hallediyor.

2.4 FacetGrid ile Çoklu Panel Grafikleri

# Her bölge için ayrı histogram
g = sns.FacetGrid(df, col="bolge", col_wrap=2,
                  height=4, aspect=1.3)
g.map_dataframe(sns.histplot, x="satis", hue="kategori",
                kde=True, stat="density", common_norm=False, alpha=0.5)
g.add_legend(title="Kategori")
g.set_titles("Bölge: {col_name}")
g.set_axis_labels("Satış (₺)", "Yoğunluk")
g.fig.suptitle("Bölgelere Göre Satış Dağılımları", y=1.02,
               fontsize=14, fontweight="bold")
plt.show()

2.5 Seaborn 0.13 Yenilikleri

Seaborn 0.13 ile gelen önemli yenilikler:

  • Kategorik fonksiyonların yeniden yazımı: native_scale=True parametresi ile sayısal ve tarih verileri artık doğru ölçekte gösteriliyor. Bu küçük ama önemli bir detay.
  • Polars DataFrame desteği: Pandas'a ek olarak Polars DataFrame'leri de doğrudan kullanılabiliyor — Polars kullanıyorsanız bu harika bir haber.
  • Objects arayüzü (deneysel): Grammar of Graphics ilhamıyla tamamen yeni, kompozisyonel bir grafik API'si. Henüz deneysel ama geleceği parlak görünüyor.
# Seaborn Objects arayüzü (deneysel)
import seaborn.objects as so

(
    so.Plot(df, x="musteri_puani", y="satis", color="kategori")
    .add(so.Dot(alpha=0.4, pointsize=3))
    .add(so.Line(), so.PolyFit(order=2))
    .facet("bolge")
    .layout(size=(14, 8))
    .label(title="Müşteri Puanı vs Satış (Objects API)")
    .show()
)

3. Plotly: İnteraktif Görselleştirmenin Kralı

Plotly, web tabanlı interaktif grafikler oluşturmak için tasarlanmış ve bu işi gerçekten iyi yapıyor. Fare ile üzerine gelme, yakınlaştırma, kaydırma, filtreleme — hepsi yerleşik olarak geliyor. Sunumlarınızda veya dashboard'larınızda dinamik grafikler istiyorsanız, Plotly tam size göre.

3.1 Plotly Express ile Hızlı Grafikler

Plotly Express, Plotly'nin yüksek seviyeli arayüzü. Tek satırda karmaşık interaktif grafikler oluşturabilirsiniz — ve sonuç gerçekten etkileyici:

# İnteraktif saçılım grafiği
fig = px.scatter(
    df, x="musteri_puani", y="satis",
    color="kategori", size="iade_orani",
    hover_data=["bolge"],
    title="Müşteri Puanı vs Satış (İnteraktif)",
    labels={"musteri_puani": "Müşteri Puanı",
            "satis": "Satış (₺)",
            "kategori": "Kategori"},
    template="plotly_white"
)
fig.update_layout(width=900, height=500)
fig.show()

3.2 İnteraktif Çubuk Grafik

# Gruplu çubuk grafik
kategori_bolge = df.groupby(["kategori", "bolge"])["satis"].mean().reset_index()

fig = px.bar(
    kategori_bolge, x="kategori", y="satis",
    color="bolge", barmode="group",
    title="Kategori ve Bölgeye Göre Ortalama Satış",
    labels={"satis": "Ortalama Satış (₺)", "kategori": "Kategori"},
    color_discrete_sequence=px.colors.qualitative.Set2,
    template="plotly_white"
)
fig.update_layout(
    xaxis_tickangle=-30,
    legend_title="Bölge",
    width=800, height=450
)
fig.show()

3.3 Zaman Serisi Görselleştirme

# İnteraktif zaman serisi (range slider ile)
aylik = df.groupby(["ay", "kategori"])["satis"].mean().reset_index()

fig = px.line(
    aylik, x="ay", y="satis", color="kategori",
    title="Aylık Satış Trendi (Kategoriye Göre)",
    labels={"ay": "Tarih", "satis": "Ortalama Satış (₺)"},
    template="plotly_white"
)
fig.update_xaxes(rangeslider_visible=True)
fig.update_layout(width=900, height=500)
fig.show()

O range slider özelliği müthiş bir dokunuş. Kullanıcılar belirli bir tarih aralığını seçip grafikleri filtreleyebiliyor.

3.4 Sunburst ve Treemap

Hiyerarşik verileri görselleştirmek istiyorsanız, Plotly'nin sunburst ve treemap grafikleri tam aradığınız şey:

# Treemap: bölge → kategori hiyerarşisi
hiyerarsi = df.groupby(["bolge", "kategori"])["satis"].sum().reset_index()

fig = px.treemap(
    hiyerarsi, path=["bolge", "kategori"], values="satis",
    title="Satış Dağılımı (Bölge → Kategori)",
    color="satis", color_continuous_scale="Viridis"
)
fig.update_layout(width=800, height=500)
fig.show()

3.5 Plotly 6 Yenilikleri

Plotly 6, performans ve uyumluluk açısından ciddi bir sıçrama yaptı. İşte öne çıkanlar:

  • Narwhals entegrasyonu: Plotly Express artık Pandas, Polars ve PyArrow DataFrame'lerini doğal olarak destekliyor. Veri kopyalama ortadan kalktı — bu özellikle büyük veri setlerinde gözle görülür bir hız farkı yaratıyor.
  • Base64 kodlama: Python ve JavaScript arasındaki iletişim hızlandırıldı.
  • Yenilenmiş Kaleido: Statik görsel dışa aktarımı artık çok daha hafif ve kararlı. Eski Kaleido ile yaşanan sorunları bilenler bu değişikliği takdir edecektir.
  • Subtitle desteği: Tüm Plotly Express grafiklerinde alt başlık kullanılabiliyor.
# Plotly 6: Polars DataFrame doğrudan kullanılabilir
# import polars as pl
# df_polars = pl.from_pandas(df)
# fig = px.scatter(df_polars, x="musteri_puani", y="satis", color="kategori")
# fig.show()

# Statik görsel kaydetme (yenilenmiş Kaleido ile)
fig = px.box(df, x="kategori", y="satis", color="bolge",
             title="Kutu Grafiği: Satış Dağılımı")
fig.write_image("kutu_grafik.png", scale=2)  # Yüksek çözünürlük
fig.write_html("kutu_grafik.html")  # İnteraktif HTML

4. Üç Kütüphane Karşılaştırması

Tamam, üç kütüphaneyi de gördük. Peki aralarındaki farklar tam olarak neler? Aynı veriyi üçüyle de görselleştirdiğinizde farklar net biçimde ortaya çıkıyor:

ÖzellikMatplotlibSeabornPlotly
Öğrenme eğrisiOrtaDüşükDüşük-Orta
Kod miktarıFazlaAzAz
Görsel kaliteİyi (özelleştirme ile)Çok iyi (varsayılan)Çok iyi
EtkileşimSınırlıSınırlıTam interaktif
İstatistiksel grafiklerManuelYerleşikKısmi
Web/DashboardZayıfZayıfGüçlü (Dash)
Performans (büyük veri)İyiOrtaOrta (WebGL ile iyi)
Özelleştirme esnekliğiMaksimumOrtaİyi
Akademik yayınlarStandartYaygınNadir

5. Hangi Durumda Hangisi?

Her kütüphanenin parladığı senaryolar farklı. Kısa bir karar rehberi:

Matplotlib Kullanın:

  • Akademik makale veya tez için yayın kalitesinde grafikler gerekiyorsa
  • Grafik üzerinde piksel düzeyinde kontrol istiyorsanız
  • 3D görselleştirme veya animasyon yapacaksanız
  • Diğer kütüphanelerle oluşturulan grafikleri ince ayar yapmak istiyorsanız (Seaborn grafikleri dahil)

Seaborn Kullanın:

  • Hızlı keşifsel veri analizi (EDA) yapıyorsanız
  • İstatistiksel ilişkileri görselleştirmek istiyorsanız — güven aralıkları, regresyon gibi
  • Dağılım karşılaştırmaları (violin, swarm, box plot) gerekiyorsa
  • Az kodla profesyonel görünümlü grafikler istiyorsanız

Plotly Kullanın:

  • İnteraktif grafikler gerekiyorsa (hover, zoom, filter)
  • Web uygulaması veya dashboard geliştiriyorsanız
  • Sunumlarda dinamik görselleştirmeler kullanacaksanız
  • Hiyerarşik veri (sunburst, treemap) görselleştiriyorsanız

Pratik bir ipucu: Çoğu projede tek bir kütüphaneyle sınırlı kalmak zorunda değilsiniz. EDA sırasında Seaborn, rapor için Matplotlib, sunum için Plotly kullanmak gayet yaygın bir yaklaşım.

6. Grafik Tasarım İpuçları

Hangi kütüphaneyi kullanırsanız kullanın, iyi bir görselleştirme yapmanın bazı temel kuralları var. Bunları yıllarca yanlış yaparak öğrendim, siz öğrenmek zorunda kalmayın:

  • Başlık ve etiketler zorunludur: Her grafik ne gösterdiğini açıkça belirtmeli. Eksen etiketlerini ve birimleri eklemeyi sakın unutmayın.
  • Renkleri bilinçli kullanın: Renk körlüğüne uyumlu paletler tercih edin. Matplotlib 3.10'un petroff10 paleti bu konuda iyi bir başlangıç noktası.
  • Karmaşıklıktan kaçının: Bir grafikte çok fazla bilgi göstermeye çalışmak mesajı bulandırır. Üç-dört değişkenden fazlasını tek grafiğe koymaya çalışmayın.
  • Doğru grafik tipini seçin: Trend için çizgi, dağılım için histogram/box plot, karşılaştırma için çubuk, ilişki için saçılım. Basit ama etkili bir kural.
  • DPI ayarına dikkat edin: Yayın için en az 300 DPI, web için 150 DPI yeterli.
# Yayın kalitesinde grafik kaydetme
fig, ax = plt.subplots(figsize=(8, 5))
sns.boxplot(data=df, x="kategori", y="satis", palette="Set2", ax=ax)
ax.set_title("Kategoriye Göre Satış Dağılımı", fontsize=13)
ax.set_xlabel("Kategori")
ax.set_ylabel("Satış (₺)")
fig.tight_layout()

# Farklı formatlar
fig.savefig("grafik.png", dpi=300, bbox_inches="tight")     # Web/sunum
fig.savefig("grafik.svg", format="svg", bbox_inches="tight") # Vektörel (yayın)
fig.savefig("grafik.pdf", format="pdf", bbox_inches="tight") # Akademik yayın

Sıkça Sorulan Sorular (SSS)

Python veri görselleştirmeye yeni başlıyorum, hangi kütüphaneyi öğrenmeliyim?

Matplotlib ile başlamanızı tavsiye ederim. Diğer tüm kütüphaneler (Seaborn dahil) Matplotlib üzerine inşa edildiğinden, temel kavramları anlamak gerçekten önemli. Temelleri kavradıktan sonra günlük analizler için Seaborn'a, interaktif ihtiyaçlar için Plotly'ye geçiş yapabilirsiniz.

Seaborn ve Matplotlib arasındaki fark nedir?

Seaborn, Matplotlib üzerine kurulu bir üst düzey kütüphane. Matplotlib ile 10-15 satır süren bir grafik, Seaborn ile genellikle 2-3 satırda tamamlanıyor. Seaborn ayrıca güven aralıkları, KDE ve regresyon çizgileri gibi istatistiksel öğeleri otomatik olarak ekliyor. Ama Matplotlib, özelleştirme esnekliğinde hâlâ rakipsiz — tam kontrol istiyorsanız oraya dönmeniz gerekecek.

Plotly grafikleri nasıl kaydedilir?

fig.write_html("dosya.html") ile interaktif HTML olarak veya fig.write_image("dosya.png") ile statik görsel olarak kaydedebilirsiniz. Statik kayıt için kaleido paketinin kurulu olması gerekiyor. Plotly 6 ile yenilenen Kaleido, önceki sürümlere göre çok daha stabil çalışıyor.

Büyük veri setlerinde hangi kütüphane daha performanslı?

Milyonlarca veri noktası varsa Matplotlib en hızlısı. Plotly, WebGL renderer (render_mode="webgl") ile büyük saçılım grafiklerinde iyi performans gösteriyor. Seaborn ise Matplotlib üzerine istatistiksel hesaplamalar eklediği için büyük veri setlerinde biraz daha yavaş kalabiliyor. Plotly 6'nın Narwhals entegrasyonu ile Polars DataFrame kullanmak da performansı gözle görülür şekilde artırıyor.

Dashboard oluşturmak için hangi aracı kullanmalıyım?

İnteraktif dashboard'lar için Plotly Dash en güçlü seçenek. Flask üzerine inşa edilmiş ve yalnızca Python bilgisiyle production-ready web dashboard'ları oluşturabiliyorsunuz. Daha basit ihtiyaçlar için Streamlit hızlı bir alternatif. Jupyter ortamında kalmak istiyorsanız, Plotly'nin interaktif widget'ları veya ipywidgets de işinizi görebilir.

Yazar Hakkında Editorial Team

Our team of expert writers and editors.