Question

J'ai un graphique à colonnes avec plusieurs séries contenant chacun de multiples points. Actuellement, les colonnes touchent tous. Je veux forcer un écart entre chaque colonne. Comment puis-je y parvenir?

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

Tableau actuel

J'utilise .Net 4, VS 2010, l'application Web. Mon code graphique 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));
        }
    }
}
Était-ce utile?

La solution

J'ai eu le diable propre travail reproduisant votre situation. Je voulais aider parce que je pensais que je pourrais apprendre quelque chose en le faisant, mais je avais besoin de votre balisage, ou mieux encore, la solution tout! Je me suis battu par le « erreur exécuter la demande de l'enfant pour ChartImg.axd » quand j'ai essayé une page simple avec un tableau. J'ai découvert que je devais ajouter un gestionnaire dans la configuration. Je me suis alors battu par l'absence de charge System.Web.DataVisualization de montage parce que l'élément de gestionnaire je copiais référencé l'ensemble 3,5 DataVisualization donc je changé que 4,0 et enfin vu un graphique. Quel travail qui a été!

La raison pour laquelle votre série entretoise ne crée pas un espace est parce qu'il n'y a pas de valeurs dans cette série. Remarquez les deux dernières lignes de code ci-dessous, qui ajoutent des valeurs nulles à la série d'espacement. Cela produit l'écart souhaité entre l'autre série, mais vous trouverez également la série intercalaire figurant dans votre légende si vous en avez un, ce qui est laid 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 regard double interligne dans la légende qui est susceptible d'être acceptable.

Autres conseils

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top