فرض فجوة بين النقاط على محور X (MS .NET Chart Controls ، Prome Clues)

StackOverflow https://stackoverflow.com/questions/2137157

سؤال

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

لقد وجدت أن تطبيق عرض نقطة (Chart1.Series[seriesName]["PointWidth"] = (0.6).ToString();) يعطيني فصل بين مجموعات القيمة x ولكن ليس بين كل نقطة سلسلة في مجموعة فردية (التي أحتاجها). باستخدام سلسلة فاصل فارغة كما اقترح في مكان آخر لا يحل المشكلة.

Current Chart

أنا أستخدم .NET 4 ، VS 2010 ، تطبيق الويب. يتبع رمز الرسم البياني الخاص بي:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Web.UI;
using System.Web.UI.DataVisualization.Charting;

namespace WebApplication1
{
    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Chart1.ChartAreas.Add("Default");
            Chart1.ChartAreas["Default"].BackColor = Color.White;
            Chart1.ChartAreas["Default"].BackSecondaryColor = Color.AliceBlue;
            Chart1.ChartAreas["Default"].BackGradientStyle = GradientStyle.TopBottom;

            Chart1.BackColor = Color.AliceBlue;
            Chart1.BackSecondaryColor = Color.White;
            Chart1.BackGradientStyle = GradientStyle.TopBottom;
            Chart1.BorderSkin.SkinStyle = BorderSkinStyle.Emboss;
            var colors = new List<Color>(GetSystemColors().Where(c=>c.Name.StartsWith("Dark")));
            var rng = new Random();
            var start = rng.Next(0, colors.Count - 1);
            for (var c = start; c < start + 6; c++)
            {
                var color = colors[c % colors.Count];
                Chart1.Series.Add(color.Name);
                Chart1.Series[color.Name].BorderColor = color;
                Chart1.Series[color.Name].BorderWidth = 1;
                Chart1.Series[color.Name].Color = Color.FromArgb((int)(255 * .7), color);
                Chart1.Series[color.Name].BackSecondaryColor = Color.White;
                Chart1.Series[color.Name].BackGradientStyle = GradientStyle.TopBottom;
                for (var year = DateTime.Now.AddYears(-5).Year; year < DateTime.Now.Year; year++)
                    Chart1.Series[color.Name].Points.Add(new DataPoint(year, rng.Next(0, 20)));

                Chart1.Series[color.Name]["PointWidth"] = (0.6).ToString();
                //Chart1.Series.Add("Spacer:" + color.Name);
                //Chart1.Series["Spacer:" + color.Name]["PointWidth"] = (0.6).ToString();
            }
            Chart1.Legends.Add("Default");
        }

        static IEnumerable<Color> GetSystemColors()
        {
            Type type = typeof(Color);
            return type.GetProperties().Where(info => info.PropertyType == type).Select(info => (Color)info.GetValue(null, null));
        }
    }
}
هل كانت مفيدة؟

المحلول

كان لدي وظيفة الشياطين الخاصة تستنسخ وضعك. أردت أن أساعد لأنني اعتقدت أنني أستطيع تعلم شيء ما عن طريق القيام بذلك ، لكنني كنت بحاجة إلى ترميزك ، أو الأفضل من ذلك ، الحل بأكمله! لقد ناضلت من خلال "خطأ تنفيذ طلب الطفل لـ chartimg.axd" عندما جربت صفحة بسيطة مع مخطط. اكتشفت أنني بحاجة لإضافة معالج في التكوين. بعد ذلك ، قاتلت من خلال الفشل في تحميل نظام التجميع. web.datavisization لأن عنصر المعالج الذي نسخته أشار إلى مجموعة Datavisualization 3.5 لذلك قمت بتغيير ذلك إلى 4.0 ورأيت أخيرًا رسمًا بيانيًا. يا لها من وظيفة كانت!

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

  for (var c = start; c < start + 6; c++)
  {
   var color = colors[c % colors.Count];
   var seriesName = "Series "+ c;//color.Name);
   Chart1.Series.Add(seriesName);
   Chart1.Series[seriesName].BorderColor = color;
   Chart1.Series[seriesName].BorderWidth = 1;
   Chart1.Series[seriesName].Color = Color.FromArgb((int)(255 * .7), color);
   Chart1.Series[seriesName].BackSecondaryColor = Color.FromArgb((int)(255 * .2), color);
   Chart1.Series[seriesName].BackGradientStyle = GradientStyle.TopBottom;
   for (var year = DateTime.Now.AddYears(-5).Year; year < DateTime.Now.Year; year++)
    Chart1.Series[seriesName].Points.Add(new DataPoint(year, rng.Next(0, 20)));

   Chart1.Series[seriesName]["PointWidth"] = (0.6).ToString();

   seriesName = "Spacer:" + seriesName;
   Chart1.Series.Add(seriesName);
   Chart1.Series[seriesName]["PointWidth"] = (0.6).ToString();
   for (var year = DateTime.Now.AddYears(-5).Year; year < DateTime.Now.Year; year++)
    Chart1.Series[seriesName].Points.Add(new DataPoint(year, 0));
  }

يمكنك ضبط نص الأسطورة على مساحة (يتم تجاهل السلسلة الفارغة ولم يتم تعيين نص الأسطورة) على النحو التالي ، ولكن لا يزال الأسطورة تظهر سلسلة الفاصل هذه.

    Chart1.Series[seriesName].LegendText = " ";

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

نصائح أخرى

يمكنك التحكم في ما إذا كانت السلسلة تظهر في الأسطورة من خلال تعيين قيمة "IsvisibleInlegend" إلى False

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