Grafik şeklini kaybetmeden grafik verilerini azaltılması

6 Cevap php

Ben bir grafik çizdirmek zorunda 100 000 datapoints ile bir veri kümesi var. Çıkan grafik yaklaşık 500px genişliğinde olacak, böylece her piksel için oldukça gereksiz görünüyor yaklaşık 200 veri noktası olacaktır.

Ben render hızlandırmak için grafiğin şeklini kaybetmeden aşırı datapoints kurtulmak için bir yol bulmalıyız. Ben aynı zamanda anti-aliasing ve diğer "efektleri kullanarak" kulüpler olarak şu anda her 100 000 puan render 10 + saniye sürebilir.

Ben sadece her 200 DataPoint alarak ve çizdirmek tarafından bu sorunu yaklaşmaya çalıştı, ama bu (grafikte sivri düşünmek ben göstermeye muktedir istiyorum) eksik daha önemli bazı noktaları ile sonuçlanır. Ben de ya her öbek gelen maksimum değeri ancak alışkanlık işi alıyor, sonra 200 datapoints parçalarını içinde veri kümesini bölme düşündüm.

Burada benim ihtiyaçlarına uygun bir yöntemin farkında mı? I istimal dil grafiği GD tarafından oluşturulur ve veri MySQL geliyor, PHP, bu yüzden bu bazı iyileştirmeleri bekliyoruz.


Veriler bu biçimdedir:

Datetime               Value
2005-01-30 00:00:00    35.30
2005-01-30 01:00:00    35.65
2005-01-30 02:00:00    36.15
2005-01-30 03:00:00    35.95
...

Ve sonuç grafiği şu anda bu gibi görünüyor:

alt text

6 Cevap

Bu 200'de 1 tatlı ciddi veri kaybı gibi geliyor bana, ve grafik üzerinde bir değer ile temsil edilmesi gerektiğini bu 200 değerleri anlamlı bir ortalama ile ikame edilebilir yeterince yakın değilse, kendinize bir sorun var. Ortalama yeterince iyi değilse, daha önemli ve dahil edilmelidir hangi verilerin anlatmak için bir kriter bulmak gerekir ve biz, o ne tür veri istatistiksel özelliklerini bilmiyorum, çünkü biz onunla size yardımcı olamaz , ya da herhangi bir değer diğerinden daha önemli olacağını neden. Bu ek bilgi ile, belki daha spesifik bir cevap verilebilir.

EDIT: grafiğe bakarak sonra, koyu mavi alan bu ikisi arasındaki değerlerdir çünkü doğru, belirli bir aralıkta minimum ve maksimum hem de gerekir gibi görünüyor? Belki 100 değerleri alır ve grafikte her nokta 6 yerine 200 değerleriyle, ya da böyle bir şey ile yapılır, böylece minimum, maksimum ve ortalama bir grafik yapabilirsiniz.

Bu soru oldukça eski olduğunu biliyorum ama neredeyse benzer bir sorun vardı.

Grafiğin şeklini etkilemeden görüntülemek için noktalarının sayısını azaltmak için, biz Ramer-Douglas-Peucker algoritm kullanın. Bu algoritma ile sıkıştırılmamış grafiği ile bir arasında şekil farkı farkedilemez.

Işe yarayabilecek başka yaklaşım 200 nokta bidonları içine grafik bölme ve her aralıkta maksimum, minimum ve ortalama puan ama tüm atmak edilir. Aralığında üç puan Her özgün yerde çizilen alır, bu yüzden aşırı değerlerin yerleri değişmeyecek. Medyan kullanarak yerine maxima size ortalama kullandıysanız süzülmüş grafik yukarı kaymaya neden olacak, çok daha aşırı asgarilerden çünkü ortalama muhtemelen set veri için daha iyi çalışacaktır.

Senin sorunun bir yaklaşım max-min kırım olduğunu; Ben de yok teslim etmek ya da ben sizinle paylaşmak istiyorum bir tanımı ve algoritma için size Google'ı öneririz.

Bunun ötesinde ben basit kırım (yani aşırı puan atmadan) tarafından izlenen bir low-pass (anti-aliasing) filtresi kullanmak düşünüyorum.

Ben noktaların her 200 demet sıradan ortalama yeterli olacağını düşünüyorum.

Ben kodu / veri kaynağı gibi görünüyor bilmiyorum ama geri uygulama için getirilen veri noktalarının sayısını azaltmak için mysql select deyimi üzerinde bir ayrı yapmak mümkün mü?