MS Chart Control две оси Y
Я строю диаграмму, чтобы показать элементы по объему по категориям. До сих пор мне удавалось показывать элементы по объему, поскольку это простая диаграмма x/y, однако я хотел бы показать y2, и я знаю, что элементы управления MS Chart имеют встроенный AxisY2, однако, когда я пробую что-либо с ним, диаграмма становится все фанки.
вот что я ищу (в ascii art):
item1 |[][][][][].............| cat1
item2 |[][]...................| cat2
item3 |[][....................| cat1
item4 |[][][][][][][][........| cat1
|_______________________|
0 1 2 3 4 5
Как упоминалось ранее, я могу получить элементы и подсчеты, чтобы показать, что это относительно легко, это категории этого я не могу понять.
спасибо
5 ответов
короткий ответ Во-первых : согласно примерам MS, нет прямого способа сделать это, но просто обходной трюк : постройте серию на второй диаграмме, соответствующей точно вашей существующей позиции области (путем выполнения копии вашей серии), имеющей невидимую первичную ось X/Y и видимую вторичную ось Y (AxisY2). И установите chartArea и backcolors скопированной серии в прозрачный. (Это можно применить к вторичной оси 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 chart, пытаясь поместить две разные оси Y на область диаграммы. Я хотел поместить два разных масштабированных ряда (тот же масштаб X, разные масштабы Y : один слева для Серии A , другой справа для Серии B).
На самом деле, это оказалось настоящим кошмар, когда можно было ожидать, что это будет довольно просто. Правда в том, что элементы управления MS Chart определенно не адаптированы для данном конкретном случае ИМХО. Множественный образец оси Y, предложенный в примерах примеров mscc, является ужасным и очень уродливым обходным путем, который требует двух карт поверх стандартного, играя с видимостью и прозрачностью, чтобы достичь желаемого эффекта (что звучит как очень плохой трюк с иллюзией).
надеясь, что это будет обогащено и исправлено надлежащим образом в будущих версиях, если вам действительно нужен эффективный способ управления несколькими осями Y, sitck для ZedGraph
вот что это сделало для меня-после того, как я создал диаграмму, я добавил следующие строки:
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;
не было необходимости накладывать две диаграммы или что-то еще!
становится еще лучше:
для использования второй оси Y нет необходимости во второй области диаграммы. Вы можете решить для серии, какую ось вы хотите использовать с серией.Свойство YAxisType. Взгляните на документацию поhttp://msdn.microsoft.com/en-us/library/dd489216.aspx
Martijn
вы можете добавить столько рядов по оси 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()
устранение:
chart1.ChartAreas[1].Свойства alignwithchartarea = диаграмма1.ChartAreas[0].Название; диаграмма1.ChartAreas[1].AlignmentOrientation = AreaAlignmentOrientations.Все;