Найти - Пользователи
Полная версия: Разреживания точек для графика
Начало » Data Mining » Разреживания точек для графика
1
agryn
Есть массив данных.
 dataset = [[1467492000.0, 25.67],[1467492060.0, 5.2],[1467492120.0, 3.1] ... [x, y]] # всего где то 60 тысяч элементов; типа поминутные данные приблизительно за месяц
С них я строю svg-график (генериться на низком уровне без всяких фишек по сжатию), соответственно с учетом тегов (да и без них наверное) в сиром виде размер файла зашкаливает.
Пробовал вот этот Ramer-Douglas-Peucker алгоритм, но в моем случае он не помог так как количество точек на выходе зависит насколько часто точки лежат на прямой, да и контролировать количество точек на выходе нельзя.
Какой бы алгоритм (ну и/или либу) сообщество предложило для “разреживания” точек кривой с наперед заданным количеством точек на выходе.
scidam
Можно попробовать интерполировать B-сплайном, а потом на этом сплайне выбрать точки как нужно. Например, как-то так:

 #coding: utf-8
from scipy import interpolate
import numpy as np  
# данные [[1,2], .. [x,y]] etc
input_array = np.random.rand(1000, 2)
input_array = np.array(input_array) # на всякий случай, если input_array есть list
tck, u = interpolate.splprep([input_array[:,0], input_array[:,1]], s=0)
 
resolution = 100 # хочу чтобы было 100 точек только
unew = np.arange(0, 1.0+1.0/resolution, 1.0/resolution)
r = np.array(interpolate.splev(unew,tck)).transpose()
from pylab import *
plot(r[:,0], r[:,1])
show()
doza_and
А что вы с svg собираетесь делать? Масштабировать сдвигать или просто показывать?

Когда точек много принято показывать не кривую а замещающий образ. Выбираете количество точек по оси x (ну например количество пикселей на отображающем устройстве) и рисуете диапазон изменения значений в пределах каждого интервала а не линию. Многие любят кроме диапазона нарисовать еще сверху и среднее на интервале. К этим границам можно применить алгоритмы сжатия, например который вы привели. т.е. рисовать надо не линию а полигоны или заполненные замкнутые безье кривые.
agryn
doza_and
А что вы с svg собираетесь делать?
Только показывать.
doza_and
Выбираете количество точек по оси x (ну например количество пикселей на отображающем устройстве) и рисуете диапазон изменения значений в пределах каждого интервала а не линию.
А этот способ имеет какое то общепринятое название?
doza_and
agryn
А этот способ имеет какое то общепринятое название?
Честно говоря не знаю.
agryn
Только показывать.
Если только это тогда есть еще один способ. Не париться и сделать png. Он будет меньше. :)
doza_and
agryn
А этот способ имеет какое то общепринятое название?
Честно говоря не знаю.
agryn
Только показывать.
Если только это тогда есть еще один способ. Не париться и сделать png. Он будет меньше. :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB