c# - real - MS Chart Control Two Y Axis
grafico c# (5)
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
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 incorporado AxisY2, sin embargo, cuando intento 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
Solución:
chart1.ChartAreas [1] .AlignWithChartArea = chart1.ChartAreas [0] .Name; chart1.ChartAreas [1] .AlignmentOrientation = AreaAlignmentOrientations.All;
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).
Si bien esperamos que esto se enriquezca y se solucione de manera adecuada en versiones futuras, 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!
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()