5

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

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

当前图表

我正在使用 .Net 4、VS 2010、Web 应用程序。我的图表代码如下:

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

2 回答 2

7

我有魔鬼自己的工作来重现你的情况。我想提供帮助,因为我认为这样做可以学到一些东西,但我需要你的标记,或者更好的是,整个解决方案!当我尝试使用图表的简单页面时,我遇到了“执行 ChartImg.axd 的子请求时出错”。我发现我需要在配置中添加一个处理程序。然后,我克服了加载程序集 System.Web.DataVisualization 的失败,因为我复制的处理程序元素引用了 3.5 DataVisualization 程序集,所以我将其更改为 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 = " ";

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

于 2010-01-28T10:16:36.817 回答
0

您可以通过将“IsVisibleInLegend”值设置为 false 来控制系列是否显示在图例中

于 2011-10-15T18:34:45.863 回答