SORU
28 Kasım 2008, Cuma


Bir grafik'ler için cazip doğrusal bir ölçek seçme Y Ekseni

Kod biraz bizim yazılım (ya da satırı) bir çubuk grafiği görüntülemek için yazıyorum. Her şey çok güzel gidiyor. Kafa karıştırdı şey Y ekseni etiketleme.

Arayan Y ölçek etiketli, ama bir "". çekici onları etiketlemek için tam olarak sıkışmış gibiyim istiyorlar nasıl söyleyebilir "Çekici", ve belki de, ama onu gördüğümüzde biliyoruz, değil mi? tarif edemem

Eğer veri noktaları ise:

   15, 234, 140, 65, 90

Ve kullanıcı Y ekseni, kağıt ve kalem ile hile yapmaya çalışıyoruz biraz üzerinde 10 etiketleri ile gelir sorar:

  0, 25, 50, 75, 100, 125, 150, 175, 200, 225, 250

10 (0 dahil), son kısım en yüksek değeri ötesine (234 < 250), "" 25 artış, her iyi. Eğer 8 etiketler istediler, 30 bir artış güzel görünebilirdi:

  0, 30, 60, 90, 120, 150, 180, 210, 240

Dokuz zor olurdu. Belki de 10 ya da 8 kullanmış ve kapatın yeterli olur diyoruz. Ve ne puan bazı olumsuz değildir?

Excel güzel bu sorunu ele görebiliyorum.

Herkes genel amaçlı bir algoritma (hatta bazı kaba kuvvet Tamam) bunu çözmek için biliyor mu? Hızlı bir şekilde yapmak zorunda değilim, ama güzel görünmelidir.

CEVAP
28 Kasım 2008, Cuma


O benim, uzun zaman önce O güzel bu örtülü bir grafik modülü yazdım. Gri kütle kazma şunları alır:

  • Belirlemek, alt ve üst veri bağlı. (=Üst sınır alt sınır özel durum dikkat!
  • Böl keneler gerekli miktarda Aralık.
  • Yuvarlak tik kadar güzel miktarlarda aralığı.
  • Alt ve üst bağlı buna göre ayarlayın.

Seni örnek alalım:

15, 234, 140, 65, 90 with 10 ticks
  1. alt = 15 bağlı
  2. üst = 234 bağlı
  3. = 234-15 = 219 aralığı
  4. kene = 21.9 aralığı. Bu 25.0 olmalıdır
  5. yeni alt tur = 0 = 25 * bağlı
  6. yeni üst sınır = 25 * (1) 235/25 = 250 tur

Bu yüzden aralığı = 0,25,50,...,225,250

Aşağıdaki adımları ile güzel kene aralığı:

  1. sonuç böyle 10^x böl 0.1 ve 1.0 arasında (0.1 hariç 1 dahil) yatıyor.
  2. tercüme buna göre:
    • 0.1 ->0.1
    • <= 0.2 ->0.2
    • <= 0.25 ->0.25
    • <= 0.3 ->0.3
    • <= 0.4 ->0.4
    • <= 0.5 ->0.5
    • <= 0.6 ->0.6
    • <= 0.7 ->0.7
    • <= 0.75 ->0.75
    • <= 0.8 ->0.8
    • <= 0.9 ->0.9
    • <= 1.0 ->1.0
  3. 10^x ile çarpın.

Bu durumda, 21.9 10^2 0.219 almak için bölünür. Bu &;= 0.25 lt 0.25 biz şimdi. 10^2 ile çarpılır bu 25 verir.

8 keneler ile aynı örneğe bir göz atalım:

15, 234, 140, 65, 90 with 8 ticks
  1. alt = 15 bağlı
  2. üst = 234 bağlı
  3. = 234-15 = 219 aralığı
  4. kene aralığı = 27.375
    1. 0.27375 veren, 0.3, tercüme etmek için 10^2 ile bölme (10^2 ile çarpılır) 30.
  5. yeni alt tur = 0 = 30 * bağlı
  6. bağlı = 30 * yuvarlak(1) 235/30 = 240 yeni üst

İstenen sonucu veren ;-).

------ KD tarafından eklendi------

İşte arama tabloları, vs. kullanmadan bu algoritma elde... kod:

double range = ...;
int tickCount = ...;
double unroundedTickSize = range/(tickCount-1);
double x = Math.ceil(Math.log10(unroundedTickSize)-1);
double pow10x = Math.pow(10, x);
double roundedTickRange = Math.ceil(unroundedTickSize / pow10x) * pow10x;
return roundedTickRange;

Genel olarak konuşursak, kene sayısı y ekseni gerçek kesimleri kene sayısı daha az yani alt kene içerir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • engineerguy

    engineerguy

    10 Ocak 2010
  • Phandroid

    Phandroid

    26 Ocak 2009
  • TeachMeComputer

    TeachMeCompu

    31 EKİM 2009