MS Chart Control Two Y Axis

Estoy construyendo un cuadro para mostrar los artículos por volumen por categoría. Hasta ahora he tenido éxito en mostrar elementos por volumen, ya que es un gráfico x / y simple; sin embargo, me gustaría mostrar y2 y sé que MS Chart Controls tiene un AxisY2 incorporado, sin embargo, cuando bash algo con él, el Chart get todo funky

Esto es lo que estoy buscando (en ascii art):

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

Como mencioné anteriormente, puedo obtener Elementos y conteos para mostrar bien ya que es relativamente fácil, son las Categorías las que no puedo ubicar.

Gracias

Respuesta corta primero: según los ejemplos de MS, no hay una forma directa de hacerlo, sino solo un truco alternativo: trazar su serie en un segundo gráficoArea que coincida exactamente con su posición de área existente, (realizando una copia de su serie) con primario invisible Eje X / Y y un eje Y secundario visible (AxisY2). Y configure el chartArea y los fondos de la serie copiada como transparentes. (Esto se puede aplicar al eje X secundario en el caso de gráficos de columnas en lugar de barras)

 //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; 

PD: He pasado dos noches despierto jugando con los controles de gráficos de MS, tratando de poner dos ejes Y diferentes en un área de gráfico. Quería poner dos series a escala diferente (la misma escala X, diferentes escalas Y: una a la izquierda para la Serie A, la otra a la derecha para la Serie B). De hecho, esto resultó ser una verdadera pesadilla , cuando uno podía esperar que esto fuera bastante directo. La verdad es que MS Chart Controls definitivamente NO están adaptados para este caso de uso particular en mi humilde opinión. La muestra múltiple del eje Y sugerida en los ejemplos de muestra de MSCC es una solución horrible y muy fea, que requiere dos referencias además de la predeterminada, jugar con visibilidad y transparencia para lograr el efecto deseado (que suena como una magia de ilusión muy mala truco).

Mientras espera que esto se enriquezca y se solucione de manera adecuada en futuras versiones, si realmente necesita una forma eficiente de administrar múltiples Y-Axis, siéntete con ZedGraph

Esto es lo que hizo por mí: después de crear el gráfico, agregué las siguientes líneas:

 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; 

¡No hubo necesidad de superponer dos tablas ni nada!

Se pone aún mejor:

Para usar el segundo eje Y, no hay necesidad de un segundo área de gráfico. Puede decidir por serie qué eje desea usar con la propiedad Series.YAxisType. Eche un vistazo a la documentación en http://msdn.microsoft.com/en-us/library/dd489216.aspx

Martijn

Puedes agregar tantas series en el eje Y como quieras, debajo el código es un extracto de un gráfico que uso que tiene más de 2 ejes y secundarios, el código es para vb.net pero estoy seguro de que puedes resolverlo:

  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() 

Solución:

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