2012-06-06 1 views
3

y 축에 세 개의 레이블 min, middlemax을 표시하려고합니다. 최대 - 분 = 9572. 중간을 찾는 가장 쉬운 방법은이 값이 너무 엑셀 아마 1000 간격을 증가시킬 좋은하지 않습니다 나는 좋은 값을 계산하려면 어떻게 500숫자 축의 주요 단위를 계산하는 방법

middle을 설정 2분의 9,572 = 4786.입니다 내 y 축의 경우 minmax이 주어 졌습니까? min 및/또는 max이 (가) 부정적 일 수 있습니다.

답변

2

좋은 질문입니다! 최근에 나는 최근에 비슷한 문제를 해결했던 것과 내가 행한 :

  1. 는 [1, 2, 5, 10, 20, 25, 50, 75, 100, 200, 250 같은 것을 가능한 단계의 배열을 만들기 , 500, 750, 1000, 2000, 2500, 5000, 7500, 10000]
  2. 몇 개의 레이블이 필요한지 결정 - 3이라고 생각합니다.
  3. 배열에서 단계를 선택하십시오. 9572/(3 - 1) = 4786, 가장 가까운 스텝은 5000입니다. 다음 단계와 이전 단계까지의 거리를 비교하고 여기에서 사용자 정의 반올림을 수행 할 수 있습니다 (예 : 비 둥근 단계가 다음 단계보다 20 % 그렇지 않으면 이전 것.
  4. 분명한 레이블을 선택하십시오. 실제 최소값을 취하고, 선택한 단계 (5000)로 나눕니다. 결과를 반올림합니다 (최소는 floor, 최대는 ceil). 선택한 단계로 곱하십시오. 예를 들어, 최소 및 최대 = -3400 = 2700 경우 = 5000

scaleMin = 층 (-3400/5000) * 5000 = -5000
scaleMax = CEIL (2,700/5000) * 5000

이것은 -5000, 0 및 5000의 세 레이블을 제공합니다. 아래의 Y 축 마지막 표시를 허용 할 수있는 경우 최대 값은입니다. ceil (또는 floor)을 사용하지 마십시오. 그래프 최대 값이 얼마나 떨어져 있는지 계산하고 너무 많으면 한 단계 더하십시오.

0

C#에서 구현을 제공하는 데 도움이 될 수 있습니다. Y 축의 값이 음수 인 경우 샘플이 작동하지 않을 수 있습니다. 희망은 누군가를 돕는다!

private double GetMajorStep(double yAxisMax) 
    { 
     int[] stepArray = {1, 2, 5, 10, 20, 25, 50, 75, 100, 200, 250, 500, 750, 1000, 2000, 2500, 5000, 7500, 10000, 20000, 50000,100000, 500000,1000000}; 
     const int numLabels = 2; 
     var stepSize = (int) (yAxisMax/(numLabels - 1)); 
     var possibleSteps = stepArray.Where(p => p < stepSize).ToList(); 
     if (!possibleSteps.Any()) return stepSize; 

     var nearest = possibleSteps.OrderBy(x => Math.Abs((long)x - stepSize)).First(); 
     return nearest; 
    } 
관련 문제