---
title: 'Temel Grafikler'
source: 'https://academia.sh/tr/kurslar/elektronik-tablolar/temel-grafikler'
course: 'Elektronik Tablolarla Analiz'
language: tr
updated: '2026-08-17T18:08:43+00:00'
license: 'CC BY-SA 4.0'
---

# Temel Grafikler

On grafik önerisinin dördü çizilebilir ama alanın ölçeğine ya da ölçünün toplanabilirliğine uymaz: sınıflayıcı bir eksen üzerine çizgi, sıralayıcı bir eksen üzerine çizgi, etiket olan bir alan üzerine dağılım ve ortalamalardan pasta. Aynı beş bölge ortalaması iki eksen başlangıcıyla çizildiğinde doğu ile batı arasındaki gerçek 1,67'lik oran, eksen sıfırdan başlarken 1,63 uzunluk oranı verir, 13 m³'ten başlarken 13,00 verir; aynı fark 8,0 kat büyük görünür ve tek bir okuma değişmez. Grafik sayfaya yalnız çizdiği aralığı bildirir: dört karardan grafikli sayfada biri, not düşülmüş sayfada ikisi, izli sayfada dördü geri okunur.

Bir önceki ders özet tablonun dört kararını saydı ve ikisinin sayfada hiç durmadığını gösterdi.
Rapora giren şey çoğu zaman o sayı değil, sayının resmidir. Grafik özetin üstüne iki karar daha
ekler: **hangi tür seçilecek** ve **eksen nereden başlayacak**. İlki bir uyum sorusudur, ikincisi
bir büyütme sorusu.

Bu dersin iki sayısı bunlardır: bir grafik kümesinin **kaçının alanın ölçeğine uymadığı** ve eksen
başlangıcı değişince **aynı farkın kaç kat büyük göründüğü**. Yanlarında kursun ikinci ölçüsü durur:
grafiğin kararlarından kaçı sayfadan geri okunabiliyor.

- **TO13.** Elektronik tablo yine `node` ile **modellenir**, veri kümesi **kurgudur**. Grafik bu
  modelde bir **aralık** ile birkaç **ayardan** ibarettir ve ayarlar sayfanın hücrelerinde durmaz.
- **TO14.** Alanların hangi ölçekte olduğu bu müfredatın ilk kursunda belirlendi ve burada
  tekrarlanmaz. Sayılan tek şey **grafik türünün o ölçekle uyup uymadığıdır**.
- **TO15.** Her tür ekseninden ve ölçüsünden bir şey ister: çizgi grafiği **sıralı ve eşit
  aralıklı** bir eksen, pasta ve yığılmış sütun **dilimlerin bütün vermesi**, dağılım grafiği iki
  sayısal eksen. Ortalama ve oran toplanamaz, bu yüzden dilim olamaz.
- **TO16.** Kurtarılabilirlik ölçüsü sürer: karar bir hücre formülünde yazılıysa **bir adımda**,
  ayrı bir not hücresinde **iki adımda** okunur, hiçbir hücrede yoksa **okunamaz**.

## Kaç Grafik Ölçeğine Uymuyor

```js
// grafik.mjs — elektronik tablo MODELIDIR: hucre bir eslemede durur, formul
// kendi metnini tasir, grafik bir aralik ile birkac ayardan ibarettir. Hicbir
// uygulama taklit edilmez, hicbir arac adi gecmez. Veri kumesi kurgudur:
// onceki dersin ozetlenen 1761 satirlik sayfasi.
export const TOHUM = 20260218, ABONE = 1400, TARIFE = [10, 25, 40];
const karistir = (x) => { x = Math.imul(x ^ (x >>> 16), 2246822507);
  x = Math.imul(x ^ (x >>> 13), 3266489909); return (x ^ (x >>> 16)) >>> 0; };
const uretec = (t) => { let s = karistir(t);
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const ayrik = (u, w) => { let t = 0;
  for (let i = 0; i < w.length; i++) { t += w[i]; if (u < t) return i; } return w.length - 1; };
export const BOLGE = [["kuzey", 0.28, 21, 0.06], ["guney", 0.22, 17, 0.03],
  ["dogu", 0.18, 26, 0.27], ["bati", 0.14, 14, 0.03], ["merkez", 0.18, 23, 0.08]]
  .map(([ad, pay, taban, eksik]) => ({ ad, pay, taban, eksik }));
const HARF = (j) => String.fromCharCode(65 + j);
export const formul = (yazi, f) => ({ tur: "formul", yazi, f });
export class Tablo {
  constructor(baslik, satirlar) {
    this.baslik = baslik; this.h = new Map(); this.n = satirlar.length;
    baslik.forEach((b, j) => this.h.set(`${HARF(j)}1`, b));
    satirlar.forEach((s, i) => baslik.forEach((b, j) =>
      this.h.set(`${HARF(j)}${i + 2}`, s[b])));
  }
  oku(ad) { const v = this.h.get(ad); return v && v.tur === "formul" ? v.f(this) : v; }
  yaz(ad, v) { this.h.set(ad, v); return this; }
}
export const topla = (a) => a.reduce((x, y) => x + y, 0);
export const ortala = (a) => (a.length ? topla(a) / a.length : 0);
export const SATIR = [];
let sira = 0;
for (let i = 0; i < ABONE; i++) {
  const r = uretec(TOHUM + i);
  const b = BOLGE[ayrik(r(), BOLGE.map((x) => x.pay))];
  const taban = Math.max(1.2, b.taban * Math.exp((r() + r() + r() - 1.5) * 0.62));
  for (const d of r() < 0.34 ? ["2026-01", "2026-02"] : ["2026-01"]) {
    const q = uretec(TOHUM + 7000 + sira++), u = q();
    const durum = u < b.eksik ? (q() < 0.72 ? "erisilemedi" : "form_sifir")
      : u < b.eksik + 0.035 ? "kapali" : "okundu";
    if (durum === "erisilemedi") continue;
    const okuma = durum === "okundu"
      ? Math.round(taban * (d === "2026-02" ? 0.94 : 1) * 100) / 100 : 0;
    SATIR.push({ abone_no: 10001 + i, bolge: b.ad, donem: d, okuma_m3: okuma,
      basamak: okuma < TARIFE[0] ? 1 : okuma < TARIFE[1] ? 2 : okuma < TARIFE[2] ? 3 : 4 });
  }
}

// Alanlarin olcekleri onceki kursta belirlendi; burada yalnizca grafik turunun
// o olcekle uyup uymadigi sayilir. Olcek sirasi kapsama sirasidir.
export const OLCEK = { siniflayici: 0, siralayici: 1, aralik: 2, oran: 3 };
export const ALAN = { bolge: "siniflayici", abone_no: "siniflayici",
  basamak: "siralayici", donem: "aralik", okuma_m3: "oran" };
// Her grafik turu ekseninden ve olcusunden bir sey ister.
// eksenEnAz / eksenEnCok: eksen alaninin olcegi bu araligin disindaysa tur uymaz.
// butun: dilimlerin toplaminin bir butun vermesi gerekir.
export const TUR = {
  "sutun": { eksenEnAz: 0, eksenEnCok: 3, butun: false },
  "cizgi": { eksenEnAz: 2, eksenEnCok: 3, butun: false },
  "pasta": { eksenEnAz: 0, eksenEnCok: 1, butun: true },
  "yigilmis sutun": { eksenEnAz: 0, eksenEnCok: 1, butun: true },
  "dagilim": { eksenEnAz: 2, eksenEnCok: 3, butun: false },
};
// Onerilen grafikler: eksen alani, olcu, tur ve olcunun toplanip toplanamadigi.
// Ortalama ve oran toplanamaz: dilimleri toplandiginda bir butun vermez.
export const ONERI = [
  ["bolge / toplam m3", "bolge", "sutun", true],
  ["bolge / toplam m3", "bolge", "pasta", true],
  ["bolge / toplam m3", "bolge", "cizgi", true],
  ["bolge / ortalama m3", "bolge", "sutun", false],
  ["bolge / ortalama m3", "bolge", "pasta", false],
  ["basamak / abone sayisi", "basamak", "sutun", true],
  ["basamak / abone sayisi", "basamak", "cizgi", true],
  ["bolge x basamak / abone", "bolge", "yigilmis sutun", true],
  ["donem / ortalama m3", "donem", "cizgi", false],
  ["abone_no / okuma_m3", "abone_no", "dagilim", false],
];
export const uyum = ([, alan, tur, toplanir]) => {
  const o = OLCEK[ALAN[alan]], t = TUR[tur];
  if (o < t.eksenEnAz || o > t.eksenEnCok) return "eksen olcegi";
  if (t.butun && !toplanir) return "dilimler butun vermiyor";
  return "uygun";
};
export const y = (w) => (h) => h.map((v, j) => (j ? String(v).padStart(w[j])
  : String(v).padEnd(w[0]))).join("");

if (import.meta.url === `file://${process.argv[1]}`) {
  console.log(`model (tohum ${TOHUM}): sayfa ${SATIR.length} satir, ` +
    `toplam ${topla(SATIR.map((s) => s.okuma_m3)).toFixed(1)} m3`);
  const y1 = y([24, 16, 14, 16, 25]);
  console.log("\n" + y1(["onerilen grafik", "eksen alani", "olcek", "tur", "sonuc"]));
  let uymaz = 0;
  for (const o of ONERI) {
    const s = uyum(o); if (s !== "uygun") uymaz++;
    console.log(y1([o[0], o[1], ALAN[o[1]], o[2], s]));
  }
  console.log(`\n${ONERI.length} grafik onerisinin ${uymaz} tanesi cizilebilir ama ` +
    `alanin olcegine ya da olcunun toplanabilirligine uymuyor; ` +
    `${ONERI.length - uymaz} tanesi uyuyor`);
}
```

```
model (tohum 20260218): sayfa 1761 satir, toplam 33866.8 m3

onerilen grafik              eksen alani         olcek             tur                    sonuc
bolge / toplam m3                  bolge   siniflayici           sutun                    uygun
bolge / toplam m3                  bolge   siniflayici           pasta                    uygun
bolge / toplam m3                  bolge   siniflayici           cizgi             eksen olcegi
bolge / ortalama m3                bolge   siniflayici           sutun                    uygun
bolge / ortalama m3                bolge   siniflayici           pasta  dilimler butun vermiyor
basamak / abone sayisi           basamak    siralayici           sutun                    uygun
basamak / abone sayisi           basamak    siralayici           cizgi             eksen olcegi
bolge x basamak / abone            bolge   siniflayici  yigilmis sutun                    uygun
donem / ortalama m3                donem        aralik           cizgi                    uygun
abone_no / okuma_m3             abone_no   siniflayici         dagilim             eksen olcegi

10 grafik onerisinin 4 tanesi cizilebilir ama alanin olcegine ya da olcunun toplanabilirligine uymuyor; 6 tanesi uyuyor
```

On önerinin onu da çizilebilir ve hiçbiri hata üretmez. Altısı uyar, **dördü uymaz** ve uymama üç
ayrı biçimde ortaya çıkar.

Üç grafik **eksen ölçeğinde** takılır. Bölge alanı sınıflayıcıdır: beş bölge arasında bir sıra
yoktur, dolayısıyla noktaları birleştiren bir çizgi iki bölge arasında bir ara değer olduğunu iddia
eder ve öyle bir değer yoktur. Aynı çizgi, bölgeler sayfada başka bir sırayla dizilseydi bambaşka
bir eğri verirdi. Basamak alanı sıralayıcıdır ve sıra vardır, ama basamaklar arası uzaklık
tanımsızdır; eğimin bir birimi yoktur. Abone numarası bir etikettir ve dağılım grafiğinin yatay
eksenine konduğunda numara büyüdükçe artan bir eğilim gösterir; gösterdiği tek şey abonelerin kayıt
sırasıdır.

Dördüncüsü eksende değil, **ölçüde** takılır. Bölge ortalamalarından pasta çizmek dilimleri
toplanamayan bir ölçüden dilim yapar: beş ortalamanın toplamı hiçbir şeydir ve her dilimin yüzdesi o
hiçbir şeye oranla hesaplanır. Aynı beş bölgenin **toplam** tüketiminden çizilen pasta uyar, çünkü
toplamlar gerçekten bir bütün verir. Ölçek doğru olduğunda bile ölçünün toplanabilirliği ayrı bir
koşuldur.

## Aynı Beş Sayı, İki Eksen

```js
// eksen.mjs — ayni bes sayi, iki eksen baslangici; sonra grafigin kararlarinin
// sayfadan geri okunup okunamadigi. Cubuklar metin olarak cizilir, cunku
// olculen sey bicim degil uzunluk oranidir.
import { SATIR, BOLGE, Tablo, formul, ortala, y } from "./grafik.mjs";
const GENIS = 26;
const deger = BOLGE.map((b) => ({ ad: b.ad,
  v: ortala(SATIR.filter((s) => s.bolge === b.ad).map((s) => s.okuma_m3)) }));
const enAz = Math.min(...deger.map((d) => d.v)), enCok = Math.max(...deger.map((d) => d.v));
const EKSEN = [0, Math.floor(enAz)];
const cubuk = (v, alt) => "#".repeat(Math.max(0,
  Math.round(GENIS * (v - alt) / (enCok - alt))));
const y1 = y([9, 8]);
for (const alt of EKSEN) {
  console.log(`bolge basina ortalama, dusey eksen ${alt} m3'ten baslarsa`);
  for (const d of deger) console.log(y1([d.ad, d.v.toFixed(2)]) + "  " + cubuk(d.v, alt));
  console.log("");
}
const [a, b] = [deger.find((d) => d.ad === "dogu"), deger.find((d) => d.ad === "bati")];
const oran = (alt) => cubuk(a.v, alt).length / Math.max(1, cubuk(b.v, alt).length);
console.log(`dogu ile bati arasindaki gercek oran ${(a.v / b.v).toFixed(2)}; cubuk orani ` +
  `eksen 0'dan baslarken ${oran(0).toFixed(2)}, eksen ${EKSEN[1]} m3'ten baslarken ` +
  `${oran(EKSEN[1]).toFixed(2)}`);
console.log(`ayni fark ${(oran(EKSEN[1]) / oran(0)).toFixed(1)} kat buyuk gorunuyor ve ` +
  `tek bir okuma degismedi`);

// Kararin kurtarilabilirligi: karar bir hucre formulunde yaziliysa bir adim,
// ayri bir not hucresinde iki adim, hicbir hucrede yoksa okunamaz. Grafigin
// ayari sayfanin hucrelerinde durmaz; grafik nesnesinin icinde durur.
const KOD = ["C1 grafik turu", "C2 eksen baslangici", "C3 cizilen aralik",
  "C4 dilimler butun veriyor mu"];
const geriOku = (t) => KOD.map((k) => {
  const n = k.slice(0, 2), v = [...t.h.values()];
  if (v.some((x) => x && x.tur === "formul" && x.yazi.includes(n))) return 1;
  if (v.some((x) => typeof x === "string" && x.startsWith("karar ") && x.includes(n))) return 2;
  return null;
});
const BAS = ["bolge", "ortalama_m3"];
const kayit = deger.map((d) => ({ bolge: d.ad, ortalama_m3: Math.round(d.v * 100) / 100 }));
// Grafik sayfadan yalnizca cizdigi araligi bildirir; turu, eksen ayari ve
// dilimlerin butun verip vermedigi hicbir hucrede yazmaz.
const grafikli = new Tablo(BAS, kayit)
  .yaz("D1", formul("C3 grafik A2:B6 araligini cizer", () => kayit.length));
const notlu = new Tablo(BAS, kayit)
  .yaz("D1", formul("C3 grafik A2:B6 araligini cizer", () => kayit.length))
  .yaz("D2", `karar C2: dusey eksen ${EKSEN[1]} m3'ten baslatildi`);
const izli = new Tablo(BAS, kayit)
  .yaz("D1", formul("C3 grafik A2:B6 araligini cizer", () => kayit.length))
  .yaz("D2", formul("C1 grafik turu sutundur, cunku eksen alani siniflayici", () => "sutun"))
  .yaz("D3", formul(`C2 dusey eksen ${EKSEN[1]} m3'ten baslar; sifirdan baslasaydi ` +
    `cubuk orani ${oran(0).toFixed(2)} olurdu`, () => EKSEN[1]))
  .yaz("D4", formul("C4 olcu ortalamadir, dilimleri toplanmaz, pasta cizilemez",
    () => false));

const y2 = y([30, 17, 13, 11]);
console.log("\ngrafigin karari sayfadan geri okunabiliyor mu");
console.log(y2(["karar", "grafikli sayfa", "notlu sayfa", "izli sayfa"]));
const sonuc = [grafikli, notlu, izli].map(geriOku);
KOD.forEach((k, j) => console.log(y2([k,
  ...sonuc.map((s) => (s[j] ? `${s[j]} adim` : "okunamaz"))])));
console.log(["grafikli", "notlu", "izli"].map((ad, j) =>
  `${ad} ${sonuc[j].filter(Boolean).length}/${KOD.length}`).join(", ") +
  " karar geri okunabiliyor");
```

```
bolge basina ortalama, dusey eksen 0 m3'ten baslarsa
kuzey       20.58  #######################
guney       16.97  ###################
dogu        22.80  ##########################
bati        13.62  ################
merkez      21.70  #########################

bolge basina ortalama, dusey eksen 13 m3'ten baslarsa
kuzey       20.58  ####################
guney       16.97  ###########
dogu        22.80  ##########################
bati        13.62  ##
merkez      21.70  #######################

dogu ile bati arasindaki gercek oran 1.67; cubuk orani eksen 0'dan baslarken 1.63, eksen 13 m3'ten baslarken 13.00
ayni fark 8.0 kat buyuk gorunuyor ve tek bir okuma degismedi

grafigin karari sayfadan geri okunabiliyor mu
karar                            grafikli sayfa  notlu sayfa izli sayfa
C1 grafik turu                         okunamaz     okunamaz     1 adim
C2 eksen baslangici                    okunamaz       2 adim     1 adim
C3 cizilen aralik                        1 adim       1 adim     1 adim
C4 dilimler butun veriyor mu           okunamaz     okunamaz     1 adim
grafikli 1/4, notlu 2/4, izli 4/4 karar geri okunabiliyor
```

İki çubuk kümesi aynı beş sayıyı çiziyor. Üstteki eksen sıfırdan başlar ve çubuk uzunluklarının
oranı 1,63 çıkar; doğu ile batı arasındaki gerçek oran 1,67'dir, aradaki küçük fark çubukların tam
karakterlere yuvarlanmasından gelir. Alttaki eksen en küçük değerin altındaki tam sayıdan, 13
m³'ten başlar ve aynı iki çubuğun oranı **13,00** olur. Aynı fark **8,0 kat** büyük görünür ve tek
bir okuma değişmemiştir.

Eksen başlangıcını yükseltmek kendiliğinden bir kusur değildir. Beş bölgenin ortalaması 13,62 ile
22,80 arasında sıkışıktır ve sıfırdan başlayan bir eksende aradaki farklar görünmez hale gelir;
eksen kırpıldığında görünür olurlar. Bedeli şudur: **sütun grafiğinde okunan şey uzunluk oranıdır**,
ve eksen sıfırdan başlamayınca o oran veriye ait olmaktan çıkar. Çizgi grafiğinde okunan şey
eğimdir, uzunluk değil; orada eksen kırpılabilir. Karar kuralı buradan çıkar: uzunluk okunuyorsa
eksen sıfırdan başlar, kırpılıyorsa nereden başladığı yazılır.

## Karar Nerede Duruyor

Son tablo dersin ikinci sayısıdır. **Grafikli sayfa** dört karardan yalnız birini verir: çizdiği
aralığı. Grafik hangi hücreleri okuduğunu söyler, o hücrelerden neyi nasıl gösterdiğini söylemez.
Tür, eksen başlangıcı ve dilimlerin bütün verip vermediği grafik nesnesinin içinde durur, sayfanın
hiçbir hücresinde değil; sayfayı açan ikinci kişi grafiği silip yeniden çizerse aynı resmi elde
edeceğinin bir güvencesi yoktur.

**Not düşülmüş sayfa** ikiye çıkar ve eklediği tek karar eksen başlangıcıdır. Bunun bir nedeni var:
eksen ayarı bilinçli olarak değiştirilmiş tek karardır, öbür ikisi seçilmemiş, varsayılan olarak
kalmıştır. **Elle tutulan not değiştirilen kararı yazar, kalan kararı yazmaz** — oysa ortalamalardan
çizilen pasta da tam olarak yazılmamış bir karardır.

**İzli sayfa** dördünü de bir adımda verir, çünkü grafik ayarları sayfaya taşınmıştır: eksen
başlangıcı bir hücrede durur, grafik o hücreyi okur, hücrenin formülü sıfırdan başlansaydı oranın ne
olacağını da yazar. Bedeli üç fazladan hücredir. Kursun kuralı burada da aynı biçimde çıkıyor —
elektronik tablo bir hesap aracıdır, bir kayıt aracı değildir; kayıt hücreyle satın alınır.

## Özet

- On grafik önerisinin altısı uyar, dördü çizilebilir ama uymaz ve hiçbiri hata üretmez.
- Üç uyumsuzluk eksen ölçeğindedir: sınıflayıcı bir eksen üzerine çizgi ara değer, sıralayıcı bir
  eksen üzerine çizgi birimsiz eğim, etiket olan bir alan üzerine dağılım kayıt sırası gösterir.
- Dördüncüsü ölçüdedir: ortalamaların dilimleri toplanmaz, aynı bölgelerin toplamlarından çizilen
  pasta ise uyar.
- Aynı beş sayının çubuk oranı eksen sıfırdan başlarken 1,63, 13 m³'ten başlarken 13,00 çıkar; aynı
  fark 8,0 kat büyük görünür.
- Grafik sayfaya yalnız çizdiği aralığı bırakır: dört karardan grafikli sayfada biri, not düşülmüş
  sayfada ikisi, izli sayfada dördü geri okunur.

## Sonraki Adım

Dört ders boyunca her işlem bir karar taşıdı ve kararların çoğu sayfada durmadı. Bu bir kullanım
hatası değil, aracın biçimi: elektronik tablo hesabı hücreye yazar, kararı yazmaz. Sonraki ders bu
biçimin sınırını üç yerde ölçer — sayfa kaç satırda ağırlaşır, aynı sayfayı ikinci kez açan biri
aynı sayıyı bulur mu, tek bir yanlış aralık kaç hücreye yayılır. Kurs orada kapanır ve on bir dersin
kararlarını tek bir tabloda sayar.
