2010-01-26 9 views
5

Ich habe ein Säulendiagramm mit mehreren Reihen, die jeweils mehrere Punkte enthalten. Momentan berühren sich die Spalten. Ich möchte eine Lücke zwischen jeder Spalte erzwingen. Wie kann ich das erreichen?Erzwinge eine Lücke zwischen Punkten auf der x-Achse (MS .Net-Diagrammsteuerelemente, Säulendiagramm)

Ich fand, dass die Anwendung einer PointWidth (Chart1.Series[seriesName]["PointWidth"] = (0.6).ToString();) gibt mir eine Trennung zwischen den X-Wert Gruppen, aber nicht zwischen jedem Serienpunkt in einer einzelnen Gruppe (die ich brauche). Die Verwendung einer leeren Abstandshalterserie wie suggested elsewhere löst das Problem nicht.

Current Chart

Ich bin mit .Net 4, VS 2010 Web Application. Mein Diagrammcode folgt:

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

völlig unabhängig von Ihrer Anfrage einstellen, aber wie zum Teufel tun Sie um die Ecken auf dem Graphen? – spaceman

+0

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

Antwort

7

Ich hatte den Teufel eigenen Job reproduzieren Ihre Situation. Ich wollte helfen, weil ich dachte, ich könnte so etwas lernen, aber ich brauchte Ihr Markup, oder besser gesagt, die ganze Lösung! Ich kämpfte durch die "Fehler beim Ausführen der untergeordneten Anfrage für ChartImg.axd", als ich eine einfache Seite mit einem Diagramm ausprobierte. Ich entdeckte, dass ich einen Handler in der Konfiguration hinzufügen musste. Ich kämpfte dann durch den Fehler, Assembly System.Web.DataVisualization zu laden, weil das Handler-Element, das ich kopiert habe, referenzierte die 3.5 DataVisualization Assembly, so änderte ich das auf 4.0 und sah schließlich ein Diagramm. Was für ein Job das war!

Der Grund, warum Ihre Spacer-Serie keine Lücke erzeugt, liegt darin, dass in dieser Serie keine Werte vorhanden sind. Beachten Sie die letzten beiden Codezeilen, die der Spacer-Reihe Nullwerte hinzufügen. Dies erzeugt die gewünschte Lücke zwischen den anderen Serien, aber Sie finden auch die in Ihrer Legende aufgeführte Spacer-Serie, wenn Sie eine haben, die hässlich ist, um es gelinde auszudrücken.

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

Sie können die Legende Text in einen Raum gesetzt (NB. Leerer String ignoriert und Legendentext ist nicht gesetzt) ​​wie folgt, aber die Legende zeigt noch diese Spacer-Serie.

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

Wenn Sie Glück haben, werden Sie nicht die Legende zeigen müssen, oder Sie können die Abstandshalter Serie Farben auf die gleiche Farbe wie die Legende Hintergrund und der Legende Text in Leerzeichen gesetzt. Dies führt zu einem Doppelabstand in der Legende, der wahrscheinlich akzeptabel ist.

0

können Sie steuern, ob die Serie in der Legende zeigt sich durch die „IsVisibleInLegend“ Wert auf false