代码之家  ›  专栏  ›  技术社区  ›  grenade

强制X轴上各点之间的间距(ms.net图表控件、柱形图)

  •  5
  • grenade  · 技术社区  · 16 年前

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

    我发现应用一个点宽度( chart1.series[seriesname][“pointwidth”]=(0.6).toString(); )给了我一个X值组之间的分隔,但不是在单个组中的每个系列点之间(我需要)。使用空间隔序列作为 建议在其他地方使用 不解决问题。

    我使用的是.NET 4,而不是2010,Web应用程序。我的图表代码如下:

    使用系统;
    使用system.collections.generic;
    使用系统、图纸;
    使用system.linq;
    使用system.web.ui;
    使用system.web.ui.datavisualization.charting;
    
    命名空间WebApplication1
    {
    公共分部类\u默认值:页
    {
    受保护的空页加载(对象发送程序,事件参数e)
    {
    Chart1.ChartAreas.Add(“默认”);
    chart1.chartAreas[“默认”].backcolor=color.white;
    chart1.chartAreas[“默认”].backsecondaryColor=color.aliceblue;
    Chart1.ChartAreas[“默认”].BackGradientStyle=GradientStyle.TopBottom;
    
    chart1.backcolor=color.aliceblue;
    chart1.backsecondary color=color.white;
    Chart1.BackGradientStyle=GradientStyle.TopBottom;
    chart1.borderskin.skinstyle=borderskinstyle.emboss;
    var colors=new list<color>(getSystemColors()。其中(c=>c.name.startswith(“dark”));
    var rng=新的random();
    var start=rng.next(0,colors.count-1);
    对于(var c=start;c& lt;start + 6;C++)
    {
    var color=colors[c%colors.count];
    图表1.系列.添加(color.name);
    chart1.series[color.name].bordercolor=颜色;
    chart1.series[color.name].borderwidth=1;
    chart1.series[color.name].color=color.fromargb((int)(255*.7),color);
    chart1.series[color.name].backsecondary color=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(新数据点(year,rng.next(0,20));
    
    chart1.series[color.name][“pointwidth”]=(0.6).toString();
    //chart1.series.add(“间隔符:”+color.name);
    //chart1.series[“spacer:”+color.name][“pointwidth”]=(0.6).toString();
    }
    图表1.图例。添加(“默认”);
    }
    
    静态IEnumerable<color>GetSystemColors()。
    {
    类型类型=类型(颜色);
    返回type.getproperties()。其中(info=>info.propertytype==type)。选择(info=>(color)info.getvalue(null,null));
    }
    }
    }
    < /代码> <呃。我想在每列之间加一个间隙。我怎样才能做到这一点?

    我发现应用点宽度(Chart1.Series[seriesName]["PointWidth"] = (0.6).ToString();)给我一个X值组之间的分离,但不是单个组中每个序列点之间的分离(我需要)。使用空隔套系列作为suggested elsewhere不能解决问题。

    Current Chart

    我使用的是.NET 4,而不是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));
            }
        }
    }
    
    2 回复  |  直到 15 年前
        1
  •  7
  •   Bernhard Hofmann    16 年前

    我有魔鬼自己的工作来复制你的处境。我想帮忙,因为我认为这样做可以学到一些东西,但我需要你的标记,或者更好的是,整个解决方案!当我用图表尝试一个简单的页面时,我挣扎着通过“执行chartimg.axd的子请求时出错”。我发现我需要在配置中添加一个处理程序。然后我克服了加载assembly system.web.datavisualization失败的问题,因为我复制的handler元素引用了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));
      }
    

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

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

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

        2
  •  0
  •   stevieflash42    15 年前

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