2010-01-26 2 views
5

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

Я обнаружил, что применение PointWidth (Chart1.Series[seriesName]["PointWidth"] = (0.6).ToString();) дает мне разделение между группами значений x, но не между каждой точкой в ​​отдельной группе (что мне нужно). Использование пустой разделительной серии как suggested elsewhere не решает проблему.

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)); 
     } 
    } 
} 
+0

совершенно не связан с вашим запросом, но, как в щеколда вы закругления углов на ваших графиках? – spaceman

+0

Chart1.BorderSkin.SkinStyle = BorderSkinStyle.Emboss; – grenade

ответ

7

У меня была собственная работа дьявола, воспроизводящая вашу ситуацию. Я хотел помочь, потому что я думал, что смогу чему-то научиться, но мне нужна ваша разметка или, еще лучше, целое решение! Я пробовал «Ошибка выполнения дочернего запроса для ChartImg.axd», когда пробовал простую страницу с диаграммой. Я обнаружил, что мне нужно добавить обработчик в конфиг. Затем я боролся за неспособность загрузить сборку System.Web.DataVisualization, потому что элемент обработчика, который я скопировал, ссылался на сборку DataVisualization 3.5, поэтому я изменил ее на 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 = " "; 

Если вам повезет, то вам не нужно будет показывать легенду, или вы можете установить цвета распорки серии в тот же цвет в качестве фона легенды и легенды текста пространств. Это приводит к двойному расположению в легенде, которое, вероятно, будет приемлемым.

0

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

Смежные вопросы