سؤال

هل لدى أي شخص خوارزمية مناسبة لحساب الحد الأدنى والحد الأقصى للمحور؟

عند إنشاء مخطط لمجموعة معينة من عناصر البيانات، أود أن أكون قادرًا على تقديم الخوارزمية:

  • الحد الأقصى لقيمة (y) في المجموعة
  • الحد الأدنى لقيمة (y) في المجموعة
  • عدد علامات التجزئة التي ستظهر على المحور
  • قيمة اختيارية ذلك يجب تظهر كعلامة اختيار (على سبيل المثالصفر عند إظهار قيم +ve و-ve)

يجب أن تعود الخوارزمية

  • أكبر قيمة للمحور
  • أصغر قيمة للمحور (على الرغم من أنه يمكن استنتاج ذلك من القيمة الأكبر وحجم الفاصل الزمني وعدد علامات التجزئة)
  • حجم الفاصل الزمني

يجب أن تكون علامات التجزئة على فترات منتظمة وأن تكون ذات حجم "معقول" (على سبيل المثال.1، 3، 5، وربما حتى 2.5، ولكن ليس أكثر من ذلك).

سيؤدي وجود القيمة الاختيارية إلى انحراف هذا، ولكن بدون هذه القيمة، يجب أن يظهر العنصر الأكبر بين علامتي التجزئة العلويتين، والقيمة الأدنى بين العلامتين السفليتين.

هذا سؤال لا يعتمد على اللغة، ولكن إذا كانت هناك مكتبة C#/.NET، فسيكون ذلك أمرًا مدمرًا ;)

هل كانت مفيدة؟

المحلول

لقد كنت أستخدم jQuery تعويم مكتبة الرسم البياني.إنه مفتوح المصدر ويقوم بإنشاء المحور/القراد بشكل جيد.أقترح النظر في الكود الخاص به والحصول على بعض الأفكار من هناك.

نصائح أخرى

حسنًا، هذا ما توصلت إليه في أحد تطبيقاتنا.لاحظ أنه لا يتعامل مع سيناريو "القيمة الاختيارية" الذي ذكرته، نظرًا لأن القيمة الاختيارية لدينا هي دائمًا 0، ولكن لن يكون من الصعب عليك تعديلها.

تتم إضافة البيانات باستمرار إلى السلسلة، لذلك نحافظ فقط على تحديث نطاق قيم y من خلال فحص كل نقطة بيانات عند إضافتها؛وهذا غير مكلف للغاية ويسهل تتبعه.القيم الدنيا والقصوى المتساوية لها حالة خاصة:تشير المسافة 0 إلى أنه لا ينبغي رسم أي علامات.

لا يختلف هذا الحل عن اقتراح أندرو أعلاه، فيما عدا أنه يتعامل بطريقة غامضة بعض الشيء مع بعض الكسور التعسفية لمضاعف الأس.

وأخيرا، هذه العينة في 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، إلخ.سيعطيك ذلك الحد الأدنى لعدد الخطوط الرئيسية على الأقل.(أي.(الحد الأقصى-الحد الأدنى)/(المقياس × 10^الأس) >= الحد الأدنى_لعلامات_العلامة)
  • ابحث عن الحد الأدنى لعدد صحيح مضاعف للأس والمضاعف الذي يناسب نطاقك.ستكون هذه أول علامة رئيسية.وبقية القراد مشتقة من هذا.

تم استخدام هذا لتطبيق يسمح بالتحجيم التعسفي للبيانات ويبدو أنه يعمل بشكل جيد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top