Сокращение данных графика без потери формы графика - PullRequest
11 голосов
/ 14 января 2010

У меня есть набор данных с 100 000 точек данных, которые я должен нанести на график. Результирующий график будет иметь ширину около 500 пикселей, поэтому для каждого пикселя будет около 200 точек данных, что кажется совершенно ненужным.

Мне нужно найти способ избавиться от лишних точек данных, не теряя форму графика, чтобы ускорить рендеринг. В настоящее время рендеринг всех 100 000 точек может занять более 10 секунд, так как я также использую сглаживание и другие «эффекты».

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

Кто-нибудь знает метод, который бы соответствовал моим потребностям здесь? Я использую язык PHP, граф создается GD, а данные поступают из MySQL, поэтому оптимизация некоторых из них приветствуется.


Данные в этом формате:

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
...

И результирующий график в настоящее время выглядит так:

альтернативный текст http://www.ulmanen.fi/stuff/graph-sample.png

Ответы [ 6 ]

14 голосов
/ 06 мая 2010

Я знаю, что этот вопрос довольно старый, но у меня была проблема почти похожая.

Чтобы уменьшить количество отображаемых точек без влияния на форму графика, мы используем алгоритм Ramer-Douglas-Peucker . Разница в форме между несжатым графом и графом с этим алгоритмом незаметна.

9 голосов
/ 14 января 2010

Мне кажется, что 1 из 200 - это довольно серьезная потеря данных, и если эти 200 значений, которые должны быть представлены одним значением на графике, не достаточно близки для того, чтобы содержательно заменить среднее значение, у вас возникла проблема , Если среднее не достаточно хорошее, вы должны найти критерий, чтобы сказать, какие данные более значимы и должны быть включены, и мы не можем помочь вам с этим, потому что мы не знаем, что это за данные, их статистические свойства или почему любое значение будет более значимым, чем другое. С помощью этой дополнительной информации, возможно, можно дать более конкретный ответ.

РЕДАКТИРОВАТЬ: После просмотра графика кажется, что вам нужно и минимум, и максимум в данном интервале, потому что темно-синяя область - это значения между этими двумя, правильно? Может быть, вы можете взять 100 значений и построить график из минимума, максимума и среднего, чтобы каждая точка на графике была сделана с 6 вместо 200 значений, или что-то в этом роде.

2 голосов
/ 16 января 2010

Другой подход, который может сработать, - это разбить график на 200 пунктов и отбросить все точки, кроме максимальных, минимальных и срединных, в каждом интервале. Каждая из трех точек в интервале отображается в своем первоначальном местоположении, поэтому положения крайних значений не изменятся. Использование медианы вместо среднего значения, вероятно, будет работать лучше для вашего набора данных, поскольку максимумы намного более экстремальны, чем минимумы, что приведет к смещению отфильтрованного графика вверх, если вы используете среднее значение.

2 голосов
/ 14 января 2010

Один из подходов к вашей задаче - максимальная прореживание;Я предлагаю вам Google для определения и алгоритма, которые у меня нет, или я бы с вами поделился.

Кроме того, я думаю, что вы могли бы использовать фильтр нижних частот (сглаживание), а затем простойдецимация (то есть отбрасывание лишних баллов).

1 голос
/ 14 января 2010

Я думаю, что обычного среднего из каждых 200 групп точек будет достаточно.

0 голосов
/ 14 января 2010

Я не знаю, как выглядит ваш код / ​​источник данных, но возможно ли сделать отдельный оператор MySQL для выбора, чтобы уменьшить количество точек данных, возвращаемых в ваше приложение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...