Contrôle de la carte MS à deux axes Y

Je construis un tableau pour afficher les éléments par volume et par catégorie. Jusqu’à présent, j’ai réussi à afficher les éléments par volume car c’est un diagramme x / y simple, mais j’aimerais montrer y2 et je sais que MS Chart Controls possède un AxisY2 intégré; tout génial.

Voici ce que je recherche (dans l’art ascii):

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

Comme mentionné précédemment, je peux obtenir des articles et des comptes pour montrer bien parce que c’est relativement facile, ce sont les catégories que je n’arrive pas à placer.

Merci

Réponse courte en premier: selon MS Exemples, il n’existe pas de méthode simple mais une solution de contournement: tracez votre série sur un deuxième graphique, correspondant exactement à la position de votre zone existante (en effectuant une copie de votre série) avec une primitive invisible. Axe X / Y et un axe Y secondaire visible (AxisY2). Et définissez la zone graphique et les calques arrière de la série copiée sur transparents. (Ceci peut être appliqué à l’axe X secondaire dans le cas de graphiques à colonnes plutôt que de barres)

 //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: J’ai passé deux nuits éveillé à bricoler les commandes de graphique MS, à essayer de placer deux axes Y différents sur une zone de graphique. Je voulais mettre deux séries à l’échelle différente (même échelle X, différentes échelles Y: une à gauche pour la série A, l’autre à droite pour la série B). En fait, cela s’est avéré être un véritable cauchemar , quand on pouvait s’attendre à ce que ce soit assez simple. La vérité est que les contrôles de graphique MS ne sont certainement pas adaptés pour ce cas d’utilisation particulier IMHO. L’échantillon d’axe Y multiple suggéré dans les exemples d’exemple MSCC est une solution de contournement terrible et très laide, qui nécessite deux caractères en plus de celui par défaut, jouant avec la visibilité et la transparence, pour obtenir l’effet souhaité (ce qui ressemble à une très mauvaise illusion tour).

Tout en espérant que cela sera enrichi et corrigé correctement dans les versions futures, si vous avez vraiment besoin d’un moyen efficace de gérer plusieurs axes Y, rendez-vous à ZedGraph.

Voici ce que cela a fait pour moi. Après avoir créé le tableau, j’ai ajouté les lignes suivantes:

 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; 

Il n’y avait pas besoin de superposer deux graphiques ou quoi que ce soit!

C’est encore mieux:

Pour utiliser le deuxième axe Y, il n’est pas nécessaire de créer une deuxième zone de graphique. Vous pouvez choisir par série quel axe vous souhaitez utiliser avec la propriété Series.YAxisType. Consultez la documentation sur http://msdn.microsoft.com/en-us/library/dd489216.aspx

Martijn

Vous pouvez append autant de séries que vous le souhaitez sur l’axe Y. Le code ci-dessous est un extrait d’un graphique que j’ai utilisé et comportant plus de 2 axes Y secondaires. Le code est destiné à vb.net mais je suis sûr que vous pouvez le résoudre:

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

Solution:

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