Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 26, 2016 01:14:26

agryn
От: Украина
Зарегистрирован: 2011-12-14
Сообщения: 189
Репутация: +  0  -
Профиль   Отправить e-mail  

Разреживания точек для графика

Есть массив данных.

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

Отредактировано agryn (Авг. 26, 2016 01:31:03)

Офлайн

#2 Авг. 26, 2016 05:30:02

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Разреживания точек для графика

Можно попробовать интерполировать 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()

Офлайн

#3 Авг. 26, 2016 09:55:39

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Разреживания точек для графика

А что вы с svg собираетесь делать? Масштабировать сдвигать или просто показывать?

Когда точек много принято показывать не кривую а замещающий образ. Выбираете количество точек по оси x (ну например количество пикселей на отображающем устройстве) и рисуете диапазон изменения значений в пределах каждого интервала а не линию. Многие любят кроме диапазона нарисовать еще сверху и среднее на интервале. К этим границам можно применить алгоритмы сжатия, например который вы привели. т.е. рисовать надо не линию а полигоны или заполненные замкнутые безье кривые.



Офлайн

#4 Авг. 26, 2016 23:02:32

agryn
От: Украина
Зарегистрирован: 2011-12-14
Сообщения: 189
Репутация: +  0  -
Профиль   Отправить e-mail  

Разреживания точек для графика

doza_and
А что вы с svg собираетесь делать?
Только показывать.
doza_and
Выбираете количество точек по оси x (ну например количество пикселей на отображающем устройстве) и рисуете диапазон изменения значений в пределах каждого интервала а не линию.
А этот способ имеет какое то общепринятое название?

Офлайн

#5 Авг. 27, 2016 00:00:43

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Разреживания точек для графика

agryn
А этот способ имеет какое то общепринятое название?
Честно говоря не знаю.
agryn
Только показывать.
Если только это тогда есть еще один способ. Не париться и сделать png. Он будет меньше. :)



Офлайн

#6 Авг. 27, 2016 00:00:43

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Разреживания точек для графика

agryn
А этот способ имеет какое то общепринятое название?
Честно говоря не знаю.
agryn
Только показывать.
Если только это тогда есть еще один способ. Не париться и сделать png. Он будет меньше. :)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version