MS Chart Control Две оси Y - PullRequest
       41

MS Chart Control Две оси Y

11 голосов
/ 11 августа 2010

Я строю график, чтобы показать предметы по объему по категориям. До сих пор мне удавалось показывать элементы по объему, так как это простой график x / y, однако я хотел бы показать y2, и я знаю, что MS Chart Controls имеет встроенный AxisY2, однако, когда я пытаюсь что-либо с ним получить, Chart get все фанки.

Вот что я ищу (в ascii art):

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

Как и ранее упоминалось, я могу получить элементы и счетчики, которые хорошо отображаются, поскольку это относительно просто, это категории, которые я не могу разместить.

Спасибо

Ответы [ 5 ]

31 голосов
/ 21 сентября 2011

Вот что мне удалось сделать - после того, как я создал график, я добавил следующие строки:

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;

Не было необходимости накладывать две диаграммы или что-то еще!

9 голосов
/ 05 мая 2011

Становится еще лучше:

Для использования второй оси Y нет необходимости во второй области графика. Для каждой серии вы можете решить, какую ось вы хотите использовать, используя свойство Series.YAxisType. Посмотрите документацию на http://msdn.microsoft.com/en-us/library/dd489216.aspx

Мартейн

6 голосов
/ 23 ноября 2010

Краткий ответ вначале: согласно Примерам MS, прямого способа сделать это не существует, а есть обходной прием: нарисуйте серию на втором графике, чтобы область точно соответствовала вашей существующей позиции в области (выполнив копию вашей серии)наличие невидимой первичной оси X / Y и видимой вторичной оси Y (AxisY2).И установите прозрачность диаграммы chartArea и задних копий скопированных серий.(Это может быть применено к вторичной оси X в случае столбцовых графиков, а не столбцов)

//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: я провел две ночи без сна, возиться с элементами управления диаграммами MS, пытаясь поставить две разные оси Y наОбласть Диаграммы.Я хотел поставить две по-разному масштабированные серии (одна и та же шкала Х, разные шкалы Y: одна слева для серии А, другая справа для серии В).На самом деле, это оказался настоящий кошмар , когда можно было ожидать, что это будет довольно просто.Правда в том, что Элементы управления MS Chart определенно НЕ приспособлены для этого конкретного случая использования ИМХО.Пример с несколькими осями Y, предложенный в примерах MSCC, представляет собой ужасный и очень уродливый обходной путь, для которого требуется две хартареи поверх стандартной, играющей с видимостью и прозрачностью, для достижения желаемого эффекта (который звучит как очень плохая иллюзия магиитрюк).

В надежде на то, что это будет обогащено и исправлено должным образом в будущих версиях, если вам действительно нужен эффективный способ управления несколькими осями Y, зайдите на ZedGraph

3 голосов
/ 15 марта 2012

Вы можете добавить столько рядов по оси Y, сколько хотите, ниже приведен код, который я использовал для извлечения диаграммы, имеющей более 2 вторичных осей y, код для vb.net, но я уверен, что вы можете работать это из:

        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()
2 голосов
/ 18 апреля 2011

Решение:

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