2010-01-26 11 views
5

Tengo un gráfico de columnas con varias series, cada una de las cuales contiene puntos múltiples. Actualmente, las columnas se tocan entre sí. Quiero forzar un espacio entre cada columna. ¿Cómo puedo conseguir esto?Forzar un espacio entre los puntos en el eje x (Controles de gráfico MS .Net, Gráfico de columnas)

Encontré que la aplicación de un Ancho de punto (Chart1.Series[seriesName]["PointWidth"] = (0.6).ToString();) me da una separación entre los grupos de valores x pero no entre cada punto de serie en un grupo individual (que necesito). El uso de una serie espaciadora vacía como suggested elsewhere no resuelve el problema.

Current Chart

estoy usando .Net 4, VS 2010, aplicación Web. El código de mi gráfico es el siguiente:

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

totalmente sin relación a su consulta, pero ¿cómo diablos hacer que ronda las esquinas en sus gráficos? – spaceman

+0

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

Respuesta

7

Yo tenía el trabajo de los diablos para reproducir su situación. Quería ayudar porque pensé que podría aprender algo al hacerlo, pero necesitaba tu marca, o mejor aún, ¡toda la solución! Luché a través del "Error al ejecutar la solicitud hija para ChartImg.axd" cuando probé una página simple con un gráfico. Descubrí que necesitaba agregar un controlador en la configuración. Luego luché por no cargar el ensamblado System.Web.DataVisualization porque el elemento del controlador que copié hacía referencia al ensamblado 3.5 DataVisualization, así que lo cambié a 4.0 y finalmente vi un gráfico. ¡Qué trabajo ESO fue!

La razón por la cual su serie de espaciadores no está creando un espacio es porque no hay valores en esa serie. Observe las últimas dos líneas de código a continuación, que agregan valores cero a la serie spacer. Esto produce el espacio deseado entre las otras series, pero también encontrará la serie de espaciadores enumerada en su leyenda si tiene una, lo que es feo, por decir lo menos.

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

Puede configurar el texto de la leyenda de un espacio (NB. Cadena vacía se ignora y la leyenda de texto no está establecido) de la siguiente manera, pero la leyenda seguirá mostrando estas series espaciador.

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

Si tiene suerte, usted no tendrá que mostrar la leyenda, o puede configurar los colores de la serie espaciador para el mismo color que el fondo leyenda y la leyenda de texto a los espacios. Esto da como resultado una apariencia de doble espacio en la Leyenda, que probablemente sea aceptable.

0

puede controlar si o no la serie aparece en la leyenda estableciendo el valor "IsVisibleInLegend" false

Cuestiones relacionadas