12
votes

Contrôle du graphique MS deux axe Y

Je construis un tableau pour montrer des articles en volume par catégorie. Jusqu'à présent, j'ai subi de montrer des articles en volume car il s'agit d'un graphique X / Y simple, mais j'aimerais montrer à Y2 et je sais que les commandes de graphique MS ont une axisie intégrée2 toutefois lorsque j'essaie quelque chose avec cela. tout funky.

Voici ce que je cherche (en ASCII Art): P>

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


0 commentaires

5 Réponses :


6
votes

Réponse courte Premièrement: Selon des exemples MS, il n'y a aucune autre façon de le faire, mais juste un truc de contournement: tracer votre série sur une deuxième place Chartarea correspond exactement à votre position de votre région existante (en effectuant une copie de votre série) ayant un axe X / Y primaire invisible et un axe Y visible secondaire (Axisy2). Et définir le Chartarea et les backcolors de la série copiée à transparent. (Ceci peut être appliqué à l'axe X secondaire en cas de graphiques de colonne plutôt que les 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;


3 commentaires

J'essaie votre échantillon mais pas de chance; Je reçois l'axe Y mais ils sont vides. Toute entrée? J'ai l'impression que cela se transformera en deux jours pour moi aussi ..


Je l'ai eu ... s'avère que je n'avais pas besoin de superposer des tableaux du tout! J'avais juste besoin de définir le yaxistype sur chaque série en conséquence et d'activer le 2e axe Y!


Ce Réponse résout le problème sans créer deux graphiques simplement en utilisant la fonction mise en œuvre.



2
votes

solution: xxx


0 commentaires

9
votes

Cela devient encore mieux:

Pour utiliser le deuxième axe Y, il n'y a pas besoin d'une seconde zone de graphique. Vous pouvez décider par Serie quel axe vous souhaitez utiliser avec la propriété série.Yaxistype. Jetez un coup d'œil à la documentation sur http://msdn.microsoft.com/en-us/library/ddd489216 .aspx

martijn


0 commentaires

35
votes

Voici qu'est-ce que cela a fait pour moi - après avoir créé le graphique, 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;


0 commentaires

3
votes

Vous pouvez ajouter autant de séries sur l'axe Y que vous le souhaitez, ci-dessous, le code est un extrait d'un graphique que j'utilise comportant plus de 2 axes de y secondaire, code est pour vb.net, mais je suis sûr que vous pouvez travailler Sortir:

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


0 commentaires