---
title: 'Erişilebilir Grafik'
source: 'https://academia.sh/tr/kurslar/gorsellestirme-ve-raporlama/erisilebilir-grafik'
course: 'Görselleştirme, Raporlama ve Ölçekli Analiz'
language: tr
updated: '2026-08-17T18:08:48+00:00'
license: 'CC BY-SA 4.0'
---

# Erişilebilir Grafik

Sekiz seri iki ton ailesi ve dört aydınlık basamağından oluşan varsayılan bir paletle kodlandığında tam çözücüyle sekizi de ayırt ediliyor, ton ayrımını okumayan çözücüyle yalnız dördü kalıyor. Şekil kanalı sırayla dağıtıldığında sayı dörtte kalıyor çünkü şekil dört seride başa dönüyor ve renk çakışması da dört seri arayla oluyor; şekil çakışmaya göre dağıtıldığında sekize çıkıyor. Gösterge kutusu 16 geçiş istiyor, sıralı gösterge 6, doğrudan etiketleme 0. Dokuz aydınlık basamağından iki aralıkla beşi ayırt ediliyor ve dört şekille tek gösterimin tavanı 20 seri çıkıyor.

Yedi ders boyunca ölçülen şey kanalın taşıdığı sayıydı ve her seferinde okuyucunun kanalı
**okuyabildiği** varsayıldı. Bu ders o varsayımı ölçer. Bir gösterimde birden çok seri varsa ilk
soru serilerin değerlerinin doğru okunup okunmadığı değildir; ilk soru hangi serinin hangisi
olduğudur. Bir seri komşusundan ayırt edilemiyorsa değeri de raporlanmamış sayılır.

Karşıtlık oranı hesabı, renk sistemleri ve erişilebilirlik ölçütleri Arayüz Temelleri kursunda ve
erişilebilirlik kurslarında kuruldu; bunların hiçbiri burada tekrarlanmaz ve hiçbir renk sistemi
adı yazılmaz. Buradaki soru veriye özgüdür ve tek bir sayıyla ölçülür: **ayırt edilebilir seri
sayısı**. Renk tek kodlama kanalıyken bu sayı kaç, ve yedekli kodlama onu kaça çıkarıyor.

- **GT43. Renk bir ad değil iki sayıdır.** Modelde renk, ton ailesi ile aydınlık basamağından
  oluşur. Kodlayıcı seriye bir çift atar; hiçbir renk adı ya da sistemi anılmaz.
- **GT44. Okuma çözünürlüğü iki basamaktır.** İki aydınlık basamağı en az iki basamak farklı
  olmadan ayırt edilemez, çünkü gösterimde seriler ince çizgilerdir ve birbirinden uzakta durur;
  yan yana konmuş iki geniş yüzeyin ayrımı bu değildir.
- **GT45. İki çözücü koşar.** Tam çözücü ton ailesini de aydınlık basamağını da okur. Daralmış
  çözücü ton ayrımını okumaz ve yalnız aydınlık basamağını görür; ikisi de aynı kodlamaya uygulanır.
- **GT46. Ayırt edilebilir seri sayısı küme sayısıdır.** Birbirinden ayırt edilemeyen seriler tek
  bir kümede toplanır; geri okunan seri sayısı küme sayısıdır ve serilerin toplamından küçük olur.
- **GT47. Yedekli kodlamanın yeri sonucu belirler.** İkinci bir kanal eklemek tek başına yetmez;
  kanalın, rengin çakıştığı eksende değişmesi gerekir.
- **GT48. Tek gösterimin bir tavanı vardır.** Tavan, ayırt edilebilir basamak sayısı ile şekil
  sayısının çarpımıdır; üzerinde gösterim parçalanmadan seri sayısı geri okunamaz.

## Renk Tek Kanalken

```python
# seri.py — MODELDIR: K03-K05'in kurgu olcum agi ayni tohumla uretilir.
# Sekiz seri ayni 3.199 okumanin alt kumeleridir: bes bolge ve uc tarife
# basamagi. Renk bir ad degil, iki sayidir: ton ailesi ve aydinlik basamagi.
import math

TOHUM, HAM, M32 = 20260218, 1400, 0xFFFFFFFF
DONEM = ["2026-01", "2026-02", "2026-03"]
TARIFE = [10, 25, 40]
BOLGE = [("kuzey", 0.28, 21), ("guney", 0.22, 17), ("dogu", 0.18, 26),
         ("bati", 0.14, 14), ("merkez", 0.18, 23)]


def uretec(t):
    x = ((t ^ (t >> 16)) * 2246822507) & M32
    x = ((x ^ (x >> 13)) * 3266489909) & M32
    s = [(x ^ (x >> 16)) & M32]

    def sonraki():
        s[0] = (s[0] * 1664525 + 1013904223) & M32
        return s[0] / 4294967296
    return sonraki


def ayrik(u, w):
    t = 0.0
    for i, x in enumerate(w):
        t += x
        if u < t:
            return i
    return len(w) - 1


_k, _e = [], []
for i in range(HAM):
    r = uretec(TOHUM + i)
    b = BOLGE[ayrik(r(), [x[1] for x in BOLGE])]
    ayrik(r(), [0.06, 0.24, 0.30, 0.24, 0.11, 0.05])
    ayrik(r(), [0.08, 0.14, 0.27, 0.34, 0.17])
    (_e if r() < 0.046 else _k).append(
        {"abone_no": 10001 + i, "bolge": b[0], "taban": b[2]})
GECERLI = {a["abone_no"] for a in _k}

OKUMA = []
for a in _k + _e:
    r = uretec(TOHUM + 7000 + a["abone_no"])
    for d in range(ayrik(r(), [0.05, 0.12, 0.21, 0.62])):
        t = 0.0 if r() < 0.038 else math.floor(
            a["taban"] * math.exp((r() + r() + r() - 1.5) * 0.62)
            * (1 - d * 0.05) * 100 + 0.5) / 100
        if a["abone_no"] not in GECERLI:
            r()
            continue
        OKUMA.append({"abone_no": a["abone_no"], "bolge": a["bolge"],
                      "donem": DONEM[d], "tuketim_m3": t})
        r()


def basamak(v):
    return 1 + sum(1 for t in TARIFE if v >= t)


def ortala(f):
    v = [o["tuketim_m3"] for o in OKUMA if f(o)]
    return sum(v) / len(v), len(v)


SERI = []
for ad, _, _ in BOLGE:
    d, n = ortala(lambda o, x=ad: o["bolge"] == x)
    SERI.append((ad, d, n))
for bs in (2, 3, 4):
    d, n = ortala(lambda o, x=bs: basamak(o["tuketim_m3"]) == x)
    SERI.append((f"basamak{bs}", d, n))

# Renk kanali: ton ailesi (0/1) ve aydinlik basamagi (0-8). Palet iki aileden
# dorder basamak seciyor; bu, sekiz seri icin dogal bir varsayilan dagilimdir.
BASAMAK_SAYISI, AYIRMA, SEKIL_SAYISI = 9, 2, 4
PALET = [(i // 4, [1, 3, 5, 7][i % 4]) for i in range(len(SERI))]


def tam_cozucu(x, y):
    """Iki seri ayirt edilir mi: ton farkli ya da basamak farki AYIRMA kadar."""
    return x[0] != y[0] or abs(x[1] - y[1]) >= AYIRMA


def daralmis_cozucu(x, y):
    """Ton ayrimini okumayan cozucu yalniz aydinlik basamagini gorur."""
    return abs(x[1] - y[1]) >= AYIRMA


def ayirt_edilebilir(kod, cozucu):
    """Ayirt edilemeyen seriler tek kume olur; kume sayisi geri okunan seridir."""
    kok = list(range(len(kod)))

    def bul(i):
        while kok[i] != i:
            kok[i] = kok[kok[i]]
            i = kok[i]
        return i
    for i in range(len(kod)):
        for j in range(i + 1, len(kod)):
            if not cozucu(kod[i], kod[j]):
                kok[bul(i)] = bul(j)
    return len({bul(i) for i in range(len(kod))})


print(f"{len(SERI)} seri, hepsi ayni {len(OKUMA)} okumanin alt kumesi")
print("seri        gozlem  ortalama  ton  basamak")
for (ad, d, n), (t, bsm) in zip(SERI, PALET):
    print(f"{ad:11s} {n:6d} {d:9.3f} {t:4d} {bsm:8d}")
print(f"okuma cozunurlugu: iki aydinlik basamagi en az {AYIRMA} basamak "
      f"farkli olmadan ayirt edilemez")
print(f"tam cozucuyle ayirt edilebilir seri: "
      f"{ayirt_edilebilir(PALET, tam_cozucu)}/{len(SERI)}")
print(f"ton ayrimini okumayan cozucuyle: "
      f"{ayirt_edilebilir(PALET, daralmis_cozucu)}/{len(SERI)}")
```

```
8 seri, hepsi ayni 3199 okumanin alt kumesi
seri        gozlem  ortalama  ton  basamak
kuzey          921    20.210    0        1
guney          645    16.602    0        3
dogu           557    24.674    0        5
bati           476    13.778    0        7
merkez         600    22.396    1        1
basamak2      2209    17.506    1        3
basamak3       692    30.009    1        5
basamak4        58    44.171    1        7
okuma cozunurlugu: iki aydinlik basamagi en az 2 basamak farkli olmadan ayirt edilemez
tam cozucuyle ayirt edilebilir seri: 8/8
ton ayrimini okumayan cozucuyle: 4/8
```

Palet kusursuz görünüyor. Sekiz serinin sekizi de ayrı bir renk çifti almış, hiçbir çift
tekrarlanmamış ve tam çözücü sekizini de ayırt ediyor. Bu, paleti seçen kişinin gördüğü sonuçtur.

Alt satır aynı paletin ikinci çözücü altında ne olduğunu söylüyor: **8 seriden 4'ü** kalıyor.
Kuzey ile merkez aynı aydınlık basamağını taşıyor, güney ile ikinci tarife basamağı aynı, doğu ile
üçüncüsü aynı, batı ile dördüncüsü aynı. Dört seri çifti tek bir seriye iniyor ve her çiftin hangi
üyesinin okunduğu belirsiz kalıyor. Rapor, 3.199 okumanın sekiz alt kümesini gösterdiğini
sanıyorken dördünü gösteriyor.

Bu bir palet kusuru değil, bir **yapı** kusurudur. Palet iki ton ailesini dört aydınlık basamağıyla
çaprazlamış ve sekiz gözü doldurmuş; ton ailesi okunamadığında çapraz tabloda sütun kalıyor, satır
kalmıyor. Renk tek kodlama kanalıysa bu sonuç kaçınılmazdır ve paletteki renk sayısını artırmak
işe yaramaz.

## Yedekli Kodlama Nereye Eklenir

```python
# yedek.py — sekil kanali eklenir. Nereye eklendigi sonucu belirler.
SIRAYLA = [(p[0], p[1], i % SEKIL_SAYISI) for i, p in enumerate(PALET)]
CAKISMAYA = [(p[0], p[1], i // SEKIL_SAYISI) for i, p in enumerate(PALET)]


def sekilli(x, y):
    return daralmis_cozucu(x, y) or x[2] != y[2]


print("katman                        tam cozucu  daralmis cozucu")
for ad, kod, coz in (("yalniz renk", PALET, daralmis_cozucu),
                     ("renk + sekil (sirayla)", SIRAYLA, sekilli),
                     ("renk + sekil (cakismaya)", CAKISMAYA, sekilli)):
    tam = ayirt_edilebilir([k[:2] for k in kod], tam_cozucu)
    print(f"{ad:28s} {tam:11d} {ayirt_edilebilir(kod, coz):16d}")
print(f"sirayla dagitilan sekil {SEKIL_SAYISI} tanedir ve {SEKIL_SAYISI}. seride "
      f"bastan basliyor; renk cakismasi da {SEKIL_SAYISI} seri arayla oldugu "
      f"icin iki cakisma ust uste geliyor")
```

```
katman                        tam cozucu  daralmis cozucu
yalniz renk                            8                4
renk + sekil (sirayla)                 8                4
renk + sekil (cakismaya)               8                8
sirayla dagitilan sekil 4 tanedir ve 4. seride bastan basliyor; renk cakismasi da 4 seri arayla oldugu icin iki cakisma ust uste geliyor
```

Orta satır bu dersin en pahalı bulgusudur. Şekil kanalı eklendi, dört ayrı şekil serilere sırayla
dağıtıldı ve daralmış çözücünün okuduğu sayı **dörtte kaldı**. Yedekli kodlama eklendi ama hiçbir
şey düzelmedi.

Nedeni son satırdadır. Şekiller dört tanedir ve beşinci seride başa döner; paletin renk çakışması
da tam dört seri arayladır. İki dönüş üst üste gelince aynı çakışan çiftler bu kez hem aynı
basamağı hem aynı şekli paylaşır. İkinci kanal, birincinin çakıştığı yerde birlikte çakışıyor.

Üçüncü satır düzeltmeyi veriyor: şekil, sıraya göre değil **çakışmaya göre** dağıtıldığında —
yani ilk dört seri bir şekil, sonraki dört seri başka bir şekil aldığında — daralmış çözücü de
sekizini ayırt ediyor. Kullanılan şekil sayısı dörtten ikiye **indi** ve sonuç iyileşti. Yedekli
kodlamanın ölçüsü kanal sayısı değil, kanalın nerede değiştiğidir.

## Gösterge Kutusu ve Geçiş Sayısı

```python
# gecis.py — gosterge kutusu okuyucuyu gosterimle kutu arasinda gidip
# getirir. Sag kenar konumu ucuncu bir kanaldir ve sirayi tasir.
SATIR = 12
enaz, encok = min(d for _, d, _ in SERI), max(d for _, d, _ in SERI)
konum = [round((d - enaz) / (encok - enaz) * (SATIR - 1)) for _, d, _ in SERI]
cakisan = sum(1 for i in range(len(SERI)) for j in range(i + 1, len(SERI))
              if konum[i] == konum[j])
tekil = [i for i in range(len(SERI))
         if all(konum[i] != konum[j] for j in range(len(SERI)) if j != i)]
print(f"sag kenar konumlari ({SATIR} satir): {konum}")
print(f"{len(SERI)} serinin {len(tekil)} tanesinin konumu tekil, "
      f"{cakisan} cift ayni satira dusuyor")
kutu = 2 * len(SERI)
sirali = 2 + 2 * (len(SERI) - len(tekil))
print("duzen                      gecis sayisi  ayirt edilebilir seri")
for ad, g, s in (("gosterge kutusu", kutu, ayirt_edilebilir(CAKISMAYA, sekilli)),
                 ("sirali gosterge kutusu", sirali,
                  ayirt_edilebilir(CAKISMAYA, sekilli)),
                 ("dogrudan etiketleme", 0, len(SERI))):
    print(f"{ad:26s} {g:13d} {s:22d}")
```

```
sag kenar konumlari (12 satir): [2, 1, 4, 0, 3, 1, 6, 11]
8 serinin 6 tanesinin konumu tekil, 1 cift ayni satira dusuyor
duzen                      gecis sayisi  ayirt edilebilir seri
gosterge kutusu                       16                      8
sirali gosterge kutusu                 6                      8
dogrudan etiketleme                    0                      8
```

Ayırt edilebilirlik gerekli koşuldur, yeterli değildir. Sekiz seri birbirinden ayrılıyor olabilir
ve okuyucu yine de hangisinin hangi bölge olduğunu bilmez; bunu ancak gösterge kutusuna bakarak
öğrenir. Ölçü burada **geçiş sayısıdır**: bakışın gösterimle gösterge kutusu arasında kaç kez gidip
geldiği.

Sıradan bir gösterge kutusu her seri için bir gidiş bir geliş ister; sekiz seri **16 geçiş** eder.
Gösterge kutusundaki sıra serilerin sağ kenardaki sırasıyla aynı yapıldığında okuyucu tek bir
eşlemeyle bütün listeyi çözer ve geçiş **6**'ya iner. Kalan dördü, sağ kenarda aynı satıra düşen
tek çiftten gelir: 12 satırın çözünürlüğünde güney ile ikinci tarife basamağı ayrılamıyor ve o iki
seri tek tek eşleştirilmek zorunda.

Doğrudan etiketleme geçiş sayısını **sıfıra** indirir, çünkü ad serinin bittiği yere yazılır ve
eşleme diye bir iş kalmaz. Sıralama ve doğrudan etiketleme de birer yedekli kodlama katmanıdır;
farkları, ayırt edilebilirliği değil **tanımayı** taşımalarıdır. Üç düzen de aynı sekiz seriyi
ayırt ediyor, ama okuyucudan istedikleri iş 16, 6 ve 0.

## Tek Gösterimin Tavanı

```python
# tavan.py — kac seri tek gosterimde tasinabilir.
AYRIK_BASAMAK = len(range(0, BASAMAK_SAYISI, AYIRMA))
TAVAN = AYRIK_BASAMAK * SEKIL_SAYISI
print(f"{BASAMAK_SAYISI} aydinlik basamagindan {AYIRMA} aralikla "
      f"{AYRIK_BASAMAK} tanesi ayirt edilebilir; {SEKIL_SAYISI} sekille "
      f"tavan {TAVAN} seri")
print("seri  ayirt edilebilir  parca")
for n in (8, 12, 16, 20, 24, 30, 40):
    kod = [(0, (i % AYRIK_BASAMAK) * AYIRMA,
            (i // AYRIK_BASAMAK) % SEKIL_SAYISI) for i in range(n)]
    e = ayirt_edilebilir(kod, sekilli)
    print(f"{n:4d} {e:17d} {max(1, -(-n // TAVAN)):6d}")
print(f"tek gosterimde en cok {TAVAN} seri ayirt edilebiliyor; uzerinde "
      f"gosterim parcalanmadan seri sayisi geri okunamiyor")
```

```
9 aydinlik basamagindan 2 aralikla 5 tanesi ayirt edilebilir; 4 sekille tavan 20 seri
seri  ayirt edilebilir  parca
   8                 8      1
  12                12      1
  16                16      1
  20                20      1
  24                20      2
  30                20      2
  40                20      2
tek gosterimde en cok 20 seri ayirt edilebiliyor; uzerinde gosterim parcalanmadan seri sayisi geri okunamiyor
```

Tavan iki sayıdan çıkar. Dokuz aydınlık basamağından iki basamaklık çözünürlükle beşi ayırt
edilebilir; dört şekille çarpımı **20**'dir. Yirmiye kadar her seri ayırt ediliyor, 24 seride sayı
20'de kalıyor ve dördü okunamaz oluyor; 40 seride hâlâ 20.

Bu, gösterimin en sert sınırıdır ve tasarımla aşılamaz. Yirmiden çok seri taşınacaksa gösterim
parçalanır: seriler tavanı geçmeyen gruplara bölünür ve her grup kendi gösteriminde çizilir.
Bedeli, gruplar arası karşılaştırmanın artık aynı gösterimden okunamamasıdır. Konunun kuralı
buradan çıkar — **bir gösterim, ayırt edilebilir seri sayısı kadar seri taşır; fazlası çizilmiş ama
raporlanmamış sayılır**.

## Özet

- Renk bir ad değil iki sayıdır ve modelde ton ailesi ile aydınlık basamağından oluşur; okuma
  çözünürlüğü iki basamaktır.
- İki ton ailesini dört aydınlık basamağıyla çaprazlayan varsayılan palet tam çözücüyle sekiz
  seriyi ayırt ediyor, ton ayrımını okumayan çözücüyle dördünü.
- Şekil kanalı sırayla dağıtıldığında sayı dörtte kalıyor, çünkü şekil dört seride başa dönüyor ve
  renk çakışmasıyla üst üste geliyor; çakışmaya göre dağıtıldığında iki şekille sekize çıkıyor.
- Ayırt edilebilirlik tanımayı vermez: aynı sekiz seri gösterge kutusuyla 16, sıralı göstergeyle 6,
  doğrudan etiketlemeyle 0 geçiş istiyor.
- Tek gösterimin tavanı ayırt edilebilir basamak sayısı ile şekil sayısının çarpımıdır; beş basamak
  ve dört şekille 20 seri, üzerinde gösterim parçalanmak zorundadır.

## Sonraki Adım

Sekiz derste tek bir gösterim doğru kuruldu. Soru türüyle kanal eşleştirildi, dağılımın biçimi
sayıya indi, taban çizgisi olmayan dilim ölçüldü, ilişkinin okunamaz olduğu nokta bulundu, zaman
ekseninde eğim ve mevsim ayrıldı, alan kanalının ağırlığı sayıldı, dört çarpıtma tek tek basıldı ve
son olarak kaç serinin ayırt edildiği ölçüldü. Hepsinde ölçü aynıydı: gösterim, okuyucunun geri
okuyabildiği sayı kadar doğrudur.

Bir rapor ise tek gösterimden oluşmaz. Okuyucu bir bakışta birden çok sayıyla karşılaşır ve bunlar
farklı kanallarla kodlanmış, farklı çözünürlüklerde durur. Sonraki konu ölçüyü buraya taşır: bir
bakışta kaç ölçüt geri okunabiliyor, aynı ölçüt kaç yoldan ölçtüğünü oynatmadan oynatılabiliyor ve
bir rapor ikinci kez üretildiğinde aynı sayıyı veriyor mu. Okuyucu artık bir sayıyı geri okuyan
kişi değil, o sayıyla bir karar veren kişidir.
