2010-01-26 3 views
5

J'ai un histogramme avec plusieurs séries contenant chacune plusieurs points. Actuellement, les colonnes se touchent toutes. Je veux forcer un écart entre chaque colonne. Comment puis-je atteindre cet objectif?Forcer un écart entre les points sur l'axe des x (MS .Net Chart Controls, Column Chart)

J'ai trouvé que l'application d'un PointWidth (Chart1.Series[seriesName]["PointWidth"] = (0.6).ToString();) me donne une séparation entre les groupes de valeurs x mais pas entre chaque point de série dans un groupe individuel (dont j'ai besoin). L'utilisation d'une série d'espacement vide comme suggested elsewhere ne résout pas le problème.

Current Chart

J'utilise .Net 4, VS 2010, l'application Web. Mon code de la carte suit:

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

sans aucun rapport avec votre requête, mais comment dans le diable avez-vous arrondir les angles sur vos graphiques? – spaceman

+0

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

Répondre

7

J'ai eu le travail de diables reproduisant votre situation. Je voulais aider parce que je pensais pouvoir apprendre quelque chose en faisant cela, mais j'avais besoin de votre balisage, ou mieux encore, de toute la solution! J'ai lutté à travers la "Erreur d'exécution de la requête enfant pour ChartImg.axd" lorsque j'ai essayé une page simple avec un graphique. J'ai découvert que j'avais besoin d'ajouter un gestionnaire dans la configuration. J'ai ensuite lutté contre l'échec du chargement de l'assembly System.Web.DataVisualization car l'élément gestionnaire que j'ai copié faisait référence à l'assembly 3.5 DataVisualization, j'ai donc changé cela en 4.0 et j'ai finalement vu un graphique. Quel travail c'était!

La raison pour laquelle votre série d'espacement ne crée pas d'espace est qu'il n'existe aucune valeur dans cette série. Notez les deux dernières lignes de code ci-dessous, qui ajoutent des valeurs nulles à la série spacer. Cela produit l'écart désiré entre les autres séries, mais vous trouverez également la série d'entretoise répertoriée dans votre légende si vous en avez une, ce qui est moche pour dire le moins.

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

Vous pouvez définir le texte de la légende à un espace (NB. Chaîne vide est ignorée et le texte de la légende est pas défini) comme suit, mais la légende montrera encore ces séries d'espacement.

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

Si vous êtes chanceux, vous aurez pas besoin de montrer la légende, ou vous pouvez définir les couleurs de la série entretoise à la même couleur que l'arrière-plan de la légende et le texte de la légende des espaces. Il en résulte un aspect à double interligne dans la légende qui est susceptible d'être acceptable.

0

vous pouvez contrôler si oui ou non la série apparaît dans la légende en définissant la valeur « IsVisibleInLegend » false

Questions connexes