强制x轴上的点之间的间隙(MS .Net图表控件,柱形图)

gre*_*ade 5 .net c# data-visualization mschart

我有一个包含多个系列的柱形图,每个系列包含多个点.目前这些列都相互接触.我想强制每列之间的差距.我怎样才能做到这一点?

我发现应用PointWidth(Chart1.Series[seriesName]["PointWidth"] = (0.6).ToString();)会让我在x值组之间分离,而不是在单个组中的每个系列点之间(我需要).使用其他地方建议的空间隔系列并不能解决问题.

当前图表

我正在使用.Net 4,VS 2010,Web Application.我的图表代码如下:

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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ber*_*ann 7

我有魔鬼自己的工作再现你的情况.我想帮助,因为我认为我可以通过这样做来学习,但我需要你的标记,或者更好的是,整个解决方案!当我尝试使用图表的简单页面时,我一直在努力解决"执行ChartImg.axd的子请求时出错".我发现我需要在配置中添加一个处理程序.然后,我通过加载程序集System.Web.DataVisualization失败,因为我复制的处理程序元素引用了3.5 DataVisualization程序集,因此我将其更改为4.0,最后看到了一个图形.这是一份多么棒的工作!

您的垫片系列没有产生间隙的原因是因为该系列中没有值.请注意下面的最后两行代码,它们为spacer系列添加零值.这会在其他系列之间产生所需的间隙,但是如果你有一个间隔系列,你也可以在你的图例中找到它,这至少可以说是丑陋的.

  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));
  }
Run Code Online (Sandbox Code Playgroud)

您可以将图例文本设置为空格(NB.空字符串被忽略,图例文本未设置),如下所示,但图例仍将显示这些间隔系列.

    Chart1.Series[seriesName].LegendText = " ";
Run Code Online (Sandbox Code Playgroud)

如果幸运的话,您不需要显示图例,也可以将间隔系列颜色设置为与图例背景相同的颜色,将图例文本设置为空格.这导致Legend中的双间距外观可能是可接受的.