2008-09-09 53 views
5

Có ai có thuật toán phong nha để tính toán trục minima và cực đại?Đồ thị (Biểu đồ) Thuật toán

Khi tạo một biểu đồ cho một tập hợp của các mục dữ liệu, tôi muốn để có thể cung cấp cho các thuật toán:

  • giá trị lớn nhất (y) trong tập
  • tối thiểu (y) giá trị trong tập
  • số điểm đánh dấu để xuất hiện trên trục
  • một giá trị tùy chọn mà phải xuất hiện như một đánh dấu (ví dụ như bằng không khi hiển thị ve và giá trị -ve)

Thuật toán phải trả lại

  • giá trị trục lớn nhất
  • giá trị trục nhỏ nhất (mặc dù điều đó có thể được suy ra từ lớn nhất, kích thước khoảng thời gian và số tick)
  • kích thước khoảng

Các dấu chấm phải ở khoảng thời gian thông thường phải có kích thước "hợp lý" (ví dụ: 1, 3, 5, thậm chí có thể là 2,5, nhưng không phải là bất kỳ quả sung sig nào nữa).

Sự hiện diện của giá trị tùy chọn sẽ nghiêng điều này, nhưng không có giá trị đó, mục lớn nhất sẽ xuất hiện giữa hai dấu tick trên cùng, giá trị thấp nhất giữa hai giá trị dưới cùng.

Đây là một câu hỏi ngôn ngữ-agnostic, nhưng nếu có một C#/NET thư viện xung quanh, điều đó sẽ được đập vỡ;.)

+0

Xem thêm http://stackoverflow.com/questions/361681/algorithm-for-nice-grid-line-intervals-on-a-graph và http://stackoverflow.com/questions/237220/ dấu-thuật-cho-một-đồ-trục –

Trả lời

0

Tôi đã sử dụng thư viện đồ thị jQuery flot. Đó là mã nguồn mở và làm thế hệ trục/đánh dấu khá tốt. Tôi muốn đề nghị xem mã của nó và véo một số ý tưởng từ đó.

0

tôi có thể đề nghị như sau:

  • Đặt một số lượng tối thiểu trực quan hấp dẫn của dòng chính. Điều này sẽ tùy thuộc vào bản chất của dữ liệu mà bạn đang trình bày và kích thước của cốt truyện bạn đang làm, nhưng 7 là số khá tốt
  • Chọn số mũ và hệ số dựa trên sự tiến triển của 1, 2, 5, 10, v.v. sẽ cung cấp cho bạn ít nhất số lượng tối thiểu các dòng chính. (ví dụ: (max-min)/(tỷ lệ x 10^số mũ)> = minimum_tick_marks)
  • Tìm bội số nguyên tối thiểu của số mũ và số nhân phù hợp trong phạm vi của bạn. Đây sẽ là lần đánh dấu đầu tiên. Phần còn lại của ve bắt nguồn từ điều này.

Điều này được sử dụng cho một ứng dụng cho phép chia tỷ lệ dữ liệu tùy ý có vẻ hoạt động tốt.

2

OK, đây là những gì tôi đã đưa ra cho một trong các ứng dụng của chúng tôi. Lưu ý rằng nó không đối phó với kịch bản "giá trị tùy chọn" mà bạn đề cập, vì giá trị tùy chọn của chúng tôi luôn là 0, nhưng không khó để bạn sửa đổi.

Dữ liệu được liên tục thêm vào chuỗi nên chúng tôi chỉ cập nhật phạm vi giá trị y bằng cách kiểm tra từng điểm dữ liệu khi được thêm; điều này rất rẻ và dễ theo dõi.Các giá trị nhỏ nhất và tối đa bằng nhau được đặt biệt theo đặc biệt: khoảng cách bằng 0 cho biết không có điểm đánh dấu nào được vẽ.

Giải pháp này không giống với đề xuất của Andrew ở trên, ngoại trừ việc nó đề cập, theo cách hơi kludgy với một số phân số tùy ý của hệ số mũ.

Cuối cùng, mẫu này nằm trong C#. Hy vọng nó giúp.

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; 
    } 
Các vấn đề liên quan