Принудительный разрыв между точками на оси x (элементы управления MS .Net Chart, столбчатая диаграмма) - PullRequest
5 голосов
/ 26 января 2010

У меня есть столбчатая диаграмма с несколькими сериями, каждая из которых содержит несколько точек. В настоящее время все столбцы касаются друг друга. Я хочу сделать разрыв между каждой колонкой. Как мне этого добиться?

Я обнаружил, что применение PointWidth (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));
        }
    }
}

Ответы [ 2 ]

7 голосов
/ 28 января 2010

У меня была собственная работа дьяволов, воспроизводящая вашу ситуацию. Я хотел помочь, потому что думал, что смогу чему-то научиться, но мне нужна была ваша разметка или, еще лучше, целое решение! Я пробовал "Ошибка выполнения дочернего запроса для 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 голосов
/ 15 октября 2011

Вы можете контролировать, будет ли серия отображаться в легенде, установив для значения «IsVisibleInLegend» значение false

...