MS Chart Control due assi Y

MS Chart Control due assi Y

Ecco cosa ha fatto per me:dopo aver 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 altro!


È ancora meglio:

Per utilizzare il secondo asse Y, non è necessaria una seconda area del grafico. Puoi decidere per serie quale asse desideri utilizzare con la proprietà Series.YAxisType. Dai un'occhiata alla documentazione su http://msdn.microsoft.com/en-us/library/dd489216.aspx

Martin


Prima risposta breve:secondo gli esempi di MS, non esiste un modo diretto per farlo, ma solo un trucco alternativo:traccia la tua serie su un secondo chartArea che corrisponde esattamente alla posizione dell'area esistente, (eseguendo una copia della tua serie) con primaria invisibile Asse X/Y e un asse Y secondario visibile (AsseY2). E imposta chartArea e i backcolor della serie copiata su trasparenti. (Questo può essere applicato all'asse X secondario in caso di grafici a colonne piuttosto che a barre)

//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 da sveglio a pasticciare con i controlli della carta MS, cercando di mettere due diversi assi Y su un'area della carta. Volevo mettere due serie in scala diversa (stessa scala X, scale Y diverse:una a sinistra per la serie A, l'altra a destra per la serie B). In effetti, questo si è rivelato un vero incubo forte> , quando ci si potrebbe aspettare che questo sia abbastanza semplice. La verità è che MS Chart Controls NON è assolutamente adattato per questo particolare caso d'uso A PARER MIO. L'esempio di asse Y multiplo suggerito negli esempi di esempio MSCC è una soluzione orribile e molto brutta, che richiede due aree del grafico sopra quella predefinita, giocando con visibilità e trasparenza, per ottenere l'effetto desiderato (che suona come una pessima illusione magica trucco).

Pur sperando che questo venga arricchito e risolto in modo corretto nelle versioni future, se hai davvero bisogno di un modo efficiente per gestire più assi Y, vai su ZedGraph