문제

축 최소값과 최대값을 계산하는 적절한 알고리즘을 가진 사람이 있나요?

특정 데이터 항목 세트에 대한 차트를 생성할 때 다음 알고리즘을 제공하고 싶습니다.

  • 세트의 최대(y) 값
  • 세트의 최소(y) 값
  • 축에 표시할 눈금 수
  • 선택적 값 ~ 해야 하다 진드기로 나타납니다(예:+ve 및 -ve 값을 표시할 때 0)

알고리즘은 다음을 반환해야 합니다.

  • 가장 큰 축 값
  • 가장 작은 축 값(가장 큰 축 값, 간격 크기 및 틱 수에서 추론할 수 있음)
  • 간격 크기

진드기는 일정한 간격으로 있어야 하며 "합리적인" 크기여야 합니다(예:1, 3, 5, 아마도 2.5일 수도 있지만 더 이상 기호 그림은 아닙니다).

선택적 값이 있으면 이 값이 왜곡되지만 해당 값이 없으면 가장 큰 항목이 위쪽 두 눈금 표시 사이에 표시되고 아래쪽 두 눈금 사이에 가장 낮은 값이 표시됩니다.

이것은 언어에 구애받지 않는 질문이지만 주변에 C#/.NET 라이브러리가 있다면 정말 충격적일 것입니다. ;)

도움이 되었습니까?

해결책

나는 jQuery를 사용하고있다 플로트 그래프 라이브러리.오픈 소스이며 축/틱 생성을 꽤 잘 수행합니다.코드를 살펴보고 거기에서 몇 가지 아이디어를 집어내는 것이 좋습니다.

다른 팁

좋아, 여기 우리의 응용 프로그램 중 하나에 대해 내가 생각해낸 것이 있습니다.선택적 값은 항상 0이므로 언급한 "선택적 값" 시나리오는 다루지 않지만 수정하기 어렵지는 않습니다.

데이터는 계열에 지속적으로 추가되므로 각 데이터 포인트가 추가될 때 검사하여 y 값의 범위를 최신 상태로 유지합니다.이는 매우 저렴하고 추적하기 쉽습니다.최소값과 최대값이 동일한 경우는 특수한 경우입니다.간격이 0이면 마커를 그려서는 안 된다는 의미입니다.

이 솔루션은 지수 승수의 임의의 일부 부분을 약간 복잡하게 처리한다는 점을 제외하면 위의 Andrew의 제안과 다르지 않습니다.

마지막으로 이 샘플은 C#으로 되어 있습니다.도움이 되길 바랍니다.

    private float GetYMarkerSpacing()
    {
        YValueRange range   = m_ScrollableCanvas.
                    TimelineCanvas.DataModel.CurrentYRange;
        if ( range.RealMinimum == range.RealMaximum )
        {
            return 0;
        }

        float   absolute    = Math.Max(
                    Math.Abs( range.RealMinimum ),
                    Math.Abs( range.RealMaximum ) ),
            spacing     = 0;
        for ( int power = 0; power < 39; ++power )
        {
            float   temp    = ( float ) Math.Pow( 10, power );
            if ( temp <= absolute )
            {
                spacing = temp;
            }
            else if ( temp / 2 <= absolute )
            {
                spacing = temp / 2;
                break;
            }
            else if ( temp / 2.5 <= absolute )
            {
                spacing = temp / 2.5F;
                break;
            }
            else if ( temp / 4 <= absolute )
            {
                spacing = temp / 4;
                break;
            }
            else if ( temp / 5 <= absolute )
            {
                spacing = temp / 5;
                break;
            }
            else
            {
                break;
            }
        }

        return spacing;
    }

나는 다음을 추천할 수 있습니다:

  • 시각적으로 매력적인 최소 주요 라인 수를 설정하세요.이는 제시하는 데이터의 성격과 수행 중인 플롯의 크기에 따라 다르지만 7은 꽤 좋은 숫자입니다.
  • 1, 2, 5, 10 등의 순서에 따라 지수와 승수를 선택하세요.그러면 최소한의 주요 라인 수를 얻을 수 있습니다.(즉.(최대-최소)/(스케일 x 10^지수) >= 최소_틱_마크)
  • 범위에 맞는 지수와 승수의 최소 정수 배수를 찾으세요.이것이 첫 번째 주요 틱이 될 것입니다.나머지 진드기는 이것에서 파생됩니다.

이는 데이터의 임의 크기 조정을 허용하는 애플리케이션에 사용되었으며 잘 작동하는 것으로 보입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top