2010-08-11 23 views
10

Estoy construyendo un gráfico 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 intento algo con él, el Chart get todo funkyMS Chart Control Two Y Axis

Aquí es lo que estoy buscando (en el arte ASCII):

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

Como se mencionó anteriormente que puedo conseguir artículos y los recuentos para mostrar bien ya que es relativamente fácil, es el Categorías que parece que no puede I poner.

Gracias

Respuesta

5

respuesta corta primero: De acuerdo con MS ejemplos, no hay forma recta para hacer eso, pero sólo un truco solución: la parcela de su serie sobre una segunda ChartArea coinciden exactamente con su posición de área existente, (mediante la realización de una copia de su serie) que tiene un eje X/Y primario invisible 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 caso de gráficas de columnas en lugar de que las 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; 

PS: He pasado dos noches Messing despierto con los controles MS Chart, tratando de poner dos eje Y diferentes en un gráfico Zona. 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 podría esperar que esto sea bastante sencillo. La verdad es que MS Chart Controls definitivamente NO están adaptados para este caso de uso en 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 que la esperanza de que esto se enriquece y se fija de una manera adecuada en futuras versiones, si realmente necesita una manera eficiente de administrar múltiples del eje Y, sitck a ZedGraph

+0

Estoy probando su muestra pero no tuve suerte; Obtengo el eje y pero están vacíos. ¿Alguna entrada? Siento que esto también se está convirtiendo en algo de dos días para mí. – KTF

+4

Entendí ... ¡Resulta que no era necesario superponer tablas en absoluto! ¡Solo necesitaba configurar el YAxisType en cada serie en consecuencia y habilitar el 2do eje Y! – KTF

+1

Esta [respuesta] (http://stackoverflow.com/a/7505750/636676) resuelve el problema sin crear dos gráficos simplemente mediante el uso de la función implementada. – Freddy

2

Solución:

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

9

se pone aún mejor:

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

Martijn

30

Esto es lo que lo hizo para mí- después de haber creado el gráfico he añadido 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 gráficos o cualquier cosa!

+0

funcionó para mí! Gracias –

3

Puede agregar tantas series en el eje Y como desee, 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.neto, pero estoy seguro de que puede 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() 
Cuestiones relacionadas