2010-08-11 18 views
10

Sto costruendo un grafico per mostrare gli articoli per volume per categoria. Finora ho avuto successo nel mostrare articoli per volume in quanto è un semplice grafico x/y, tuttavia mi piacerebbe mostrare y2 e so che MS Chart Controls ha un AxisY2 integrato, tuttavia quando provo qualcosa con esso il grafico ottiene tutto eccentrico.MS Chart Control Two Asse Y

Ecco quello che sto cercando (in ASCII Art):

item1 |[][][][][].............| cat1 
item2 |[][]...................| cat2 
item3 |[][....................| cat1 
item4 |[][][][][][][][........| cat1 
     |_______________________| 
     0 1 2 3 4 5 

Come precedentemente accennato posso ottenere Articoli e conta di mostrare bene come questo è relativamente facile, è la categorie che non posso sembrare piazzare.

Grazie

risposta

5

Risposta breve prima: Secondo Esempi MS, non v'è alcuna retta via per farlo, ma solo un trucco soluzione: Trama tua serie su un secondo ChartArea corrispondenti esattamente la vostra posizione zona esistente, (eseguendo una copia della serie) con asse X/Y primario invisibile e un asse Y secondario visibile (AxisY2). E imposta il graficoArea e il backcolors della serie copiata su trasparente. (Questo può essere applicato all'asse X secondario in caso di grafici delle colonne piuttosto che bar)

//Suppose you already have a ChartArea with the series plotted and the left Y Axis 
//Add a fake Area where the only appearent thing is your secondary Y Axis 
ChartArea area1 = chart.ChartAreas.Add("ChartAreaCopy_" + series.Name); 
area1.BackColor = Color.Transparent; 
area1.BorderColor = Color.Transparent; 
area1.Position.FromRectangleF(area.Position.ToRectangleF()); 
area1.InnerPlotPosition.FromRectangleF(area.InnerPlotPosition.ToRectangleF()); 
area1.AxisX.MajorGrid.Enabled = false; 
area1.AxisX.MajorTickMark.Enabled = false; 
area1.AxisX.LabelStyle.Enabled = false; 
area1.AxisY.MajorGrid.Enabled = false; 
area1.AxisY.MajorTickMark.Enabled = false; 
area1.AxisY.LabelStyle.Enabled = false; 

area1.AxisY2.Enabled = AxisEnabled.True; 
area1.AxisY2.LabelStyle.Enabled = true; 

// Create a copy of specified series, and change Y Values to categories 
Series seriesCopy = chart.Series.Add(series.Name + "_Copy"); 
seriesCopy.ChartType = series.ChartType; 
foreach(DataPoint point in series.Points) 
{ 
    double category = getYourItemCategory(point.XValue); 
    seriesCopy.Points.AddXY(point.XValue, category); 
} 

// Hide copied series 
seriesCopy.IsVisibleInLegend = false; 
seriesCopy.Color = Color.Transparent; 
seriesCopy.BorderColor = Color.Transparent; 

//Drop it in the chart to make the area show (only the AxisY2 should appear) 
seriesCopy.ChartArea = area1.Name; 

PS: ho passato due notti Messing sveglio con MS comandi grafici, cercando di mettere due differenti asse Y in un grafico La zona. Volevo mettere due serie in scala diversa (stessa scala X, diverse scale Y: una a sinistra per la serie A, l'altra a destra per la serie B). In effetti, questo si è rivelato un vero incubo , quando ci si poteva aspettare che fosse abbastanza semplice. La verità è che i controlli grafici MS NON sono adatti per questo particolare caso d'uso IMHO. Il campione multiplo dell'asse Y suggerito negli esempi di esempio MSCC è una soluzione orribile e molto brutta, che richiede due chartareas in cima a quello predefinito, giocando con visibilità e trasparenza, per ottenere l'effetto desiderato (che suona come una pessima illusione magica trucco).

Sperando per questo di essere arricchito e fissati in modo corretto nelle versioni future, se si ha realmente bisogno di un modo efficace per gestire più asse Y, sitck a ZedGraph

+0

Sto provando il tuo campione ma senza fortuna; Prendo l'asse y ma sono vuoti. Qualche input? Mi sembra che questo si trasformi in una cosa di due giorni anche per me .. – KTF

+4

Capito ... scopre che non ho bisogno di sovrapporre i grafici a tutti! Avevo solo bisogno di impostare YAxisType su ciascuna serie di conseguenza e abilitare il secondo asse Y! – KTF

+1

Questa [risposta] (http://stackoverflow.com/a/7505750/636676) risolve il problema senza creare due grafici semplicemente utilizzando la funzione implementata. – Freddy

2

Soluzione:

chart1.ChartAreas [1] .AlignWithChartArea = chart1.ChartAreas [0] .Name; chart1.ChartAreas [1] .AlignmentOrientation = AreaAlignmentOrientations.All;

9

È ancora meglio:

Per utilizzare il secondo asse Y, non v'è alcuna necessità di una seconda area tabella. È possibile decidere per serie quale asse si desidera utilizzare con la proprietà Series.YAxisType. Date un'occhiata alla documentazione su http://msdn.microsoft.com/en-us/library/dd489216.aspx

Martijn

30

Ecco che cosa ha fatto per me- dopo ho creato il grafico ho aggiunto le seguenti righe:

chrtMain.Series[0].YAxisType = AxisType.Primary; 
chrtMain.Series[1].YAxisType = AxisType.Secondary; 

chrtMain.ChartAreas[0].AxisY2.LineColor = Color.Transparent; 
chrtMain.ChartAreas[0].AxisY2.MajorGrid.Enabled = false; 
chrtMain.ChartAreas[0].AxisY2.Enabled = AxisEnabled.True; 
chrtMain.ChartAreas[0].AxisY2.IsStartedFromZero = chrtMain.ChartAreas[0].AxisY.IsStartedFromZero; 

Non c'era bisogno di sovrapporre due grafici o qualsiasi altra cosa!

+0

ha funzionato per me! Grazie –

3

È possibile aggiungere tutte le serie sull'asse Y che si desidera, sotto il codice è un estratto da un grafico che utilizzo che ha più di 2 assi y secondari, il codice è per vb.net ma sono sicuro che puoi risolverlo:

 ChartKPI.Series.Clear() 

     ChartKPI.Series.Add("Series1") 
     ChartKPI.Series("Series1").XValueMember = "Date" 
     ChartKPI.Series("Series1").YValueMembers = "HSDPA_Vol_MBy" 
     ChartKPI.Series("Series1").Name = "HSDPA_Vol_MBy" 
     ChartKPI.Series("HSDPA_Vol_MBy").ChartType = SeriesChartType.Column 
     ChartKPI.Series("HSDPA_Vol_MBy").ToolTip = "HSDPA MBytes: #VAL" 

     ChartKPI.Series.Add("Series2") 
     ChartKPI.Series("Series2").YAxisType = AxisType.Secondary 
     ChartKPI.Series("Series2").XValueMember = "Date" 
     ChartKPI.Series("Series2").YValueMembers = "cs_voice_traffic" 
     ChartKPI.Series("Series2").Name = "cs_voice_traffic" 
     ChartKPI.Series("cs_voice_traffic").ChartType = SeriesChartType.Line 
     ChartKPI.Series("cs_voice_traffic").BorderWidth = 3 
     ChartKPI.Series("cs_voice_traffic").ToolTip = "CS Voice Traffic: #VAL" 

     ChartKPI.Series.Add("Series3") 
     ChartKPI.Series("Series3").YAxisType = AxisType.Secondary 
     ChartKPI.Series("Series3").XValueMember = "Date" 
     ChartKPI.Series("Series3").YValueMembers = "cs_conv_traffic" 
     ChartKPI.Series("Series3").Name = "cs_conv_traffic" 
     ChartKPI.Series("cs_conv_traffic").ChartType = SeriesChartType.Line 
     ChartKPI.Series("cs_conv_traffic").BorderWidth = 3 
     ChartKPI.Series("cs_conv_traffic").ToolTip = "CS Conv Traffic: #VAL" 

     ChartKPI.Series.Add("Series4") 
     ChartKPI.Series("Series4").YAxisType = AxisType.Secondary 
     ChartKPI.Series("Series4").XValueMember = "Date" 
     ChartKPI.Series("Series4").YValueMembers = "ps_backg_traffic_ul" 
     ChartKPI.Series("Series4").Name = "ps_backg_traffic_ul" 
     ChartKPI.Series("ps_backg_traffic_ul").ChartType = SeriesChartType.Line 
     ChartKPI.Series("ps_backg_traffic_ul").BorderWidth = 3 
     ChartKPI.Series("ps_backg_traffic_ul").ToolTip = "PS Backg Traffic UL: #VAL" 

     ChartKPI.Series.Add("Series5") 
     ChartKPI.Series("Series5").YAxisType = AxisType.Secondary 
     ChartKPI.Series("Series5").XValueMember = "Date" 
     ChartKPI.Series("Series5").YValueMembers = "ps_backg_traffic_dl" 
     ChartKPI.Series("Series5").Name = "ps_backg_traffic_dl" 
     ChartKPI.Series("ps_backg_traffic_dl").ChartType = SeriesChartType.Line 
     ChartKPI.Series("ps_backg_traffic_dl").BorderWidth = 3 
     ChartKPI.Series("ps_backg_traffic_dl").ToolTip = "PS Backg Traffic DL: #VAL" 

     ChartKPI.ChartAreas("ChartArea1").AxisX.Title = "HSDPA Traffic (MB)" 
     ChartKPI.ChartAreas("ChartArea1").AxisX.MajorGrid.Interval = 1 
     ChartKPI.ChartAreas("ChartArea1").AxisX.LabelStyle.Interval = 1 
     ChartKPI.ChartAreas("ChartArea1").AxisY.Title = "RRC Attempts" 
     ChartKPI.ChartAreas("ChartArea1").AxisY2.Title = "R99 Traffic (Erlang)" 

     ChartKPI.DataBind()