2010-01-26 12 views
5

Ho un istogramma con più serie contenenti ciascuna più punti. Attualmente le colonne si toccano l'una con l'altra. Voglio forzare uno spazio tra ogni colonna. Come posso raggiungere questo obiettivo?Forza uno spazio tra i punti sull'asse x (MS .Net Chart Controls, Column Chart)

Ho trovato che l'applicazione di un Punto di larghezza (Chart1.Series[seriesName]["PointWidth"] = (0.6).ToString();) mi dà una separazione tra i gruppi di valori x, ma non tra ogni punto di serie in un singolo gruppo (che ho bisogno). L'utilizzo di una serie di spaziatori vuoti come suggested elsewhere non risolve il problema.

Current Chart

Sto usando .Net 4, VS 2010 Web Application. Segue il mio codice grafico:

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

completamente estranei alla tua richiesta, ma come nel diavolo si fa arrotondare gli angoli sui vostri grafici? – spaceman

+0

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

risposta

7

Ho avuto il lavoro del diavolo che riproduceva la situazione. Volevo aiutare perché pensavo di poter imparare qualcosa facendo così, ma avevo bisogno del tuo markup, o meglio ancora, dell'intera soluzione! Ho faticato con "Errore nell'esecuzione della richiesta figlio per ChartImg.axd" quando ho provato una pagina semplice con un grafico. Ho scoperto che avevo bisogno di aggiungere un gestore nella configurazione. Ho quindi combattuto attraverso l'errore di caricamento dell'assembly System.Web.DataVisualization perché l'elemento gestore che ho copiato faceva riferimento all'assembly 3.5 DataVisualization, quindi l'ho modificato in 4.0 e infine visto un grafico. Che lavoro CHE era!

Il motivo per cui la serie di distanziatori non sta creando un intervallo è perché non ci sono valori in quella serie. Notare le ultime due righe di codice sotto, che aggiungono valori zero alla serie di distanziatori. Questo produce il divario desiderato tra le altre serie, ma troverai anche le serie di distanziatori elencate nella tua leggenda se ne hai una, che è a dir poco brutta.

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

È possibile impostare il testo della legenda di uno spazio (NB. Stringa vuota viene ignorato e il testo leggenda non è impostato) come segue, ma la leggenda continuerà a mostrare queste serie spacer.

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

Se siete fortunati, non sarà necessario mostrare la leggenda, oppure è possibile impostare i colori distanziale serie per lo stesso colore dello sfondo leggenda e il testo della legenda in spazi. Ciò si traduce in un aspetto a doppia spaziatura nella legenda che è probabile che sia accettabile.

0

è possibile controllare se la serie si presenta nella legenda impostando il valore "IsVisibleInLegend" false

Problemi correlati