2010-01-14 7 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

각 200 포인트 빈에서 최대 값을 취하는 것이 효과가없는 이유는 무엇입니까? 그래프를 스크롤 또는 확대 (예 : 한 번에 모두 표시하지 않음)하는 방법은 어떻습니까? 또한 데이터가 정적이거나 다소 정적이어서 데이터베이스에서 전처리 할 수있는 기회가있을 수 있습니까? –

+1

@martin clayton, 왜냐하면 나는 'min'스파이크를 고려하고 싶기 때문에 max를 사용하면 그들을 파괴 할 것이다. 본질적으로, 나는 200 포인트의 덩어리에서 가장 중요한 포인트를 찾는 방법이 필요하다. –

+0

해상도에서 데이터의 세부 사항을 표시 할 수없는 경우 해상도가 너무 낮습니다. – Svante

답변

9

200에서 1은 꽤 심각한 데이터 손실이며, 그래프에서 하나의 값으로 표시되어야하는 200 개의 값이 평균으로 의미있게 대체되지 않을 경우, 문제. 평균이 충분하지 않은 경우, 어떤 데이터가 더 중요하며 포함되어야 하는지를 판단하는 기준을 찾아야하며, 어떤 종류의 데이터인지, 그 통계적 특성을 모르기 때문에 우리는 당신을 도울 수 없습니다 , 또는 어떤 가치가 다른 것보다 더 중요한지에 대한 이유. 그 추가 정보로, 아마 더 구체적인 대답을 줄 수 있습니다.

편집 : 그래프를보고 나면 진한 파란색 영역이이 두 값 사이의 값이기 때문에 주어진 간격에서 최소값과 최대 값이 모두 필요합니다. 어쩌면 100 개의 값을 가져 와서 최소, 최대 및 평균에서 그래프를 만들 수 있습니다. 따라서 그래프의 모든 점은 200 개의 값 대신 6 개가되도록 만들 수 있습니다.

+0

예, min과 max를 모두 사용하는 방법에 대해서도 생각했습니다. 아마도 두 개의 선을 사용하고 inbetween와 아마도 세 번째 선을 음영 처리하여 평균 값을 맨 위에 표시함으로써 비슷한 결과를 얻을 수 있습니다. 좋은 지적이야. 누군가가 내가 의도 한대로 이것을하는 방법에 대한 견고한 방정식이 나오지 않는다면, 나는이 것을 하나의 것으로 받아 들일 것이다. –

0

어떤 코드/데이터 소스 응용 프로그램으로 가져 오는 데이터 요소의 수를 줄이기 위해 mysql select 문에서 고유 한 작업을 수행 할 수 있습니까?

+0

일부 샘플 데이터를 포함하도록 답변을 업데이트했습니다. DISTINCT를 사용하면 더 중요한 "중요"점을 건너 뛸 수 있으므로 작동하지 않습니다. –

+0

너는 지금 너가보고있는 것을보고 너비의 각 픽셀에 대해 얼마나 많은 포인트가 그 안에 담겨 있으며 어떤 픽셀 너비에 어떤 아이템이 들어 있는지를 어떻게 결정 하는가? – mynameiscoffey

1

각 200 점의 평범한 평균값으로 충분하다고 생각합니다.

+0

또는이 점수가 높을수록이 점 200 점 또는 원하는 다른 점을 취할 수 있습니다 (이 그래프에서 필요한 정보에 따라 다름) – user204724

+1

199 점에 15와 1의 값이 있으면 보통 평균값으로 충분하지 않습니다. 1200이라는 가치를 지니고 있습니다. 저는 거기에 그 하나의 별개의 스파이크를 보여주고 싶습니다. –

2

문제점에 대한 한 가지 접근법은 max-min decimation입니다. 나는 당신에게 손을 내밀 필요가없는 정의와 알고리즘을 당신에게 제안한다. 그렇지 않으면 나는 당신과 나눌 것이다.

저 너머에는 저역 통과 (앤티 앨리어스) 필터를 사용하고 단순한 데시 메이션 (즉, 과도한 점을 버리는)을 사용할 수도 있습니다.

2

다른 방법으로는 그래프를 200 포인트 빈으로 분할하고 각 간격에서 최대, 최소 및 중간 점을 제외하고 모두를 버리는 것입니다. 간격의 세 점은 원래 위치에 그려 지므로 극단 값의 위치는 변경되지 않습니다.최대 값이 최소값보다 훨씬 더 극단적이기 때문에 평균값 대신 중간 값을 사용하면 데이터 세트에서 더 잘 작동합니다. 평균값을 사용하면 필터링 된 그래프가 위로 이동합니다.

+0

좋은 지적, 고마워. –

13

나는이 질문이 꽤 오래된 것을 알고 있지만 나는 거의 비슷한 문제가있다.

그래프 모양에 영향을주지 않고 표시 할 점의 수를 줄이려면 Ramer-Douglas-Peucker algoritm을 사용합니다. 압축되지 않은 그래프와이 알고리즘을 사용하는 모양의 차이점은 눈에 띄지 않습니다.