2008-09-09 10 views
5

क्या किसी के पास अक्ष minima और maxima की गणना के लिए एक सभ्य एल्गोरिदम है?ग्राफ (चार्ट) एल्गोरिदम

जब डेटा वस्तुओं के एक सेट के लिए एक चार्ट बनाने, मैं एल्गोरिथ्म देने के लिए सक्षम होने के लिए करना चाहते हैं:

  • सेट
  • न्यूनतम में अधिकतम (y) मूल्य (y) सेट में मूल्य
  • टिक के निशान की संख्या अक्ष पर प्रकट करने के
  • एक वैकल्पिक मूल्य कि (एक टिक के रूप में दिखाई देना चाहिए जैसे शून्य जब और दिखा + ve-ve मान)

एल्गोरिथ्म

  • सबसे बड़ा अक्ष मूल्य
  • छोटी से छोटी अक्ष मूल्य (हालांकि कि सबसे बड़ा से अनुमान लगाया जा सकता है, अंतराल आकार और टिक की संख्या)
  • अंतराल आकार लौटना चाहिए

टिक्स नियमित अंतराल पर होना चाहिए "उचित" आकार (उदाहरण के लिए) 1, 3, 5, संभवत: यहां तक ​​कि 2.5, लेकिन कोई भी सिग अंजीर नहीं)।

वैकल्पिक मूल्य की उपस्थिति इसे छोड़ देगी, लेकिन उस मूल्य के बिना सबसे बड़ा आइटम शीर्ष दो टिक अंकों के बीच दिखाई देना चाहिए, नीचे दो के बीच सबसे कम मूल्य।

यह एक भाषा-नास्तिक सवाल यह है, लेकिन वहाँ एक सी #/नेट के आसपास पुस्तकालय, कि स्मैश किया जाएगा अगर;।)

+0

भी देखें http://stackoverflow.com/questions/361681/algorithm-for-nice-grid-line-intervals-on-a-graph और http://stackoverflow.com/questions/237220/ tickmark-कलन विधि के लिए एक-ग्राफ अक्ष –

उत्तर

0

मैं jQuery flot ग्राफ लाइब्रेरी का उपयोग किया गया है। यह खुला स्रोत है और धुरी/टिक पीढ़ी काफी अच्छी तरह से करता है। मैं सुझाव दूंगा कि यह कोड देख रहा है और वहां से कुछ विचारों को चुरा रहा है।

0

मैं निम्नलिखित की सिफारिश कर सकते हैं:

  • प्रमुख लाइनों की एक आकर्षक न्यूनतम संख्या सेट करें। यह आपके द्वारा पेश किए जा रहे डेटा की प्रकृति और आपके द्वारा किए जा रहे साजिश का आकार पर निर्भर करेगा, लेकिन 7 एक बहुत अच्छी संख्या
  • एक्सपोनेंट और गुणक को 1, 2 की प्रगति के आधार पर चुनें, 5, 10, आदि जो आपको कम से कम प्रमुख लाइनों की न्यूनतम संख्या देगा। (यानी (अधिकतम-मिनट)/(स्केल x 10^एक्सपोनेंट)> = न्यूनतम_टिक_मार्क)
  • अपनी सीमा के भीतर फिट होने वाले आपके एक्सपोनेंट और गुणक का न्यूनतम पूर्णांक एकाधिक खोजें। यह पहली बड़ी टिक होगी। बाकी की टिक इस से ली गई हैं।

यह उस एप्लिकेशन के लिए उपयोग किया गया था जिसने डेटा की मनमानी स्केलिंग को अच्छी तरह से काम करने की अनुमति दी थी।

2

ठीक है, यहां मैं अपने अनुप्रयोगों में से एक के लिए आया हूं। ध्यान दें कि यह आपके द्वारा निर्दिष्ट "वैकल्पिक मूल्य" परिदृश्य से निपटता नहीं है, क्योंकि हमारा वैकल्पिक मान हमेशा 0 होता है, लेकिन आपके लिए संशोधित करना मुश्किल नहीं होना चाहिए।

डेटा लगातार श्रृंखला में जोड़ा जाता है, इसलिए हम प्रत्येक डेटा बिंदु को इसके अतिरिक्त के रूप में निरीक्षण करके वाई मानों की सीमा को अद्यतित रखते हैं; यह बहुत सस्ता और ट्रैक रखने में आसान है।समान न्यूनतम और अधिकतम मूल्य विशेषीकृत हैं: 0 का एक अंतर इंगित करता है कि कोई मार्कर तैयार नहीं किया जाना चाहिए।

यह समाधान उपरोक्त एंड्रयू के सुझाव के विपरीत नहीं है, सिवाय इसके कि यह एक्सपोनेंट गुणक के कुछ मनमानी भिन्नताओं के साथ थोड़ी-थोड़ी क्लीडी तरीके से संबंधित है।

आखिरकार, यह नमूना सी # में है। आशा करता हूँ की ये काम करेगा।

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; 
    }