在 MS .Net 图表控件中的柱状图中如何在 x 轴上强制间隔点?

5
我有一个包含多个点的多系列柱状图。目前,所有的柱子都相互接触。我想要在每个柱子之间强制产生间隙。我应该如何实现这一点?
我发现使用PointWidth(Chart1.Series[seriesName]["PointWidth"] = (0.6).ToString();)可以让x值组之间产生间隔,但无法在单个组内的每个系列点之间产生间隔(这正是我需要的)。使用一个空的间隔系列suggested elsewhere无法解决问题。

Current Chart

我正在使用 .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));
        }
    }
}

完全不相关于您的查询,但是如何在图表上圆角呢? - spaceman
Chart1.BorderSkin.SkinStyle = BorderSkinStyle.Emboss; 图表1的边框皮肤样式为浮雕。 - grenade
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 = " ";

如果你很幸运,就不需要显示图例。或者你可以将间隔系列的颜色设置为与图例背景相同的颜色,并将图例文本设置为空格。这会在图例中产生双倍行距的外观,可能会被接受。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接