2010-01-14 2 views
11

У меня есть набор данных со 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 
... 

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

alt text http://www.ulmanen.fi/stuff/graph-sample.png

+1

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

+1

@martin clayton, потому что я хочу также учитывать «мин» шипы, используя max, уничтожил бы их. В сущности, мне нужен метод, чтобы найти самый важный момент в куске из 200 пунктов. –

+0

Если ваше разрешение не может отображать мелкие детали ваших данных, ваше разрешение слишком мало. – Svante

ответ

9

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

EDIT: После просмотра графика вам кажется, что вам нужен минимум и максимум за определенный интервал, потому что темно-синяя область - это значения между этими двумя, правильно? Возможно, вы можете взять 100 значений и составить график из минимального, максимального и среднего, так что каждая точка в графе будет сделана с 6 вместо 200 значений или что-то в этом роде.

+0

Да, я думал также об использовании как min, так и max. Возможно, я мог бы получить аналогичный результат, используя две линии и затеняя промежуточные и, возможно, третью строку, чтобы показать среднее значение сверху. Хорошие моменты. Если кто-то не найдет твердого уравнения о том, как это сделать, как я изначально планировал, я собираюсь отметить это, как принято. –

0

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

+0

Я обновил свой ответ, чтобы включить некоторые примеры данных. Использование DISTINCT не будет работать, поскольку оно может пропустить более «важные» точки. –

+0

Я вижу, что вы сейчас смотрите, для каждого пикселя ширины, количества точек в нем и как вы определяете, какая ширина пикселя содержит какие элементы? – mynameiscoffey

1

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

+0

Или, как было указано выше, вы можете взять максимум 200 очков или любой другой, который вы хотите (это зависит от информации, необходимой с этого графика) – user204724

+1

Обычного среднего недостаточно, если у меня 199 баллов со значением 15 и 1 point со значением 1200. Я хочу, чтобы показать, что один отличный шип там. –

2

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

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

2

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

+0

Хорошие моменты, спасибо. –

13

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

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

Смежные вопросы