.NET Chart Class - как отображать разные интервалы на одном графике
В настоящее время я работаю над проектом, который мне нужен для отображения сводной версии данных за 2011 и 2012 годы на графике этого года. График этого года отображается ежемесячно.
Это мои данные. Это происходит из-за процедуры, так что не беспокойтесь:
Date Value Coefficient
01/01/2011 15,6 0,1586
01/01/2012 17,88 0,1468
01/01/2013 11,92 0,1872
01/02/2013 1703,85 0,17
01/03/2013 1693,49 0,16
01/04/2013 1716,1 0,17
01/05/2013 1732,31 0,17
01/06/2013 1692,79 0,17
01/07/2013 1691,38 0,17
Обратите внимание, что первые две строки являются консолидированной за весь год, а остальные месяц за месяцем. Столбец Значение должен заполнять ряд столбцов, прикрепленных к основной оси Y. Коэффициент - это линия, прикрепленная к вторичной оси Y.
У меня есть этот кусок кода, который в настоящее время показывает все испорчено, с месячным интервалом:
<asp:Chart ID="Chart4" runat="server" CssClass="Chart" BorderlineDashStyle="DashDotDot"
Palette="Pastel" DataSourceID="ObjectDataSource2" ImageStorageMode="UseImageLocation"
Height="650px">
<Series>
<asp:Series Name="value" XValueMember="date" Legend="Legend1"
YValueMembers="value" YValueType="Double" ChartArea="ChartArea1" Color="CornflowerBlue"
IsValueShownAsLabel="True" LabelFormat="{0:0.##}">
</asp:Series>
<asp:Series Name="coef" XValueMember="date" Legend="Legend1" YValueMembers="coefCost"
YValuesPerPoint="4" XValueType="Date" Color="YellowGreen" ChartType="Line" IsValueShownAsLabel="True"
MarkerColor="Green" MarkerStyle="Diamond" YAxisType="Secondary" YValueType="Double"
LabelFormat="{0:0.##\%}" BorderWidth="4" ChartArea="ChartArea1">
</asp:Series>
</Series>
<ChartAreas>
<asp:ChartArea Name="ChartArea1" BackColor="Transparent" ShadowOffset="5">
<AxisY Title="US$ / 1000">
<MajorGrid Enabled="False" />
<LabelStyle Format="{0:#,##0}" />
</AxisY>
<AxisX Interval="1" IntervalOffsetType="Months" IntervalType="Months">
<MajorGrid Enabled="False" IntervalOffsetType="Auto" IntervalType="Auto" />
<LabelStyle Interval="Auto" Format="{MMM/yy}" />
<ScaleBreakStyle Spacing="1" />
<ScaleView SizeType="Months" />
</AxisX>
<AxisX2>
<MinorGrid Enabled="True" />
<MajorTickMark Enabled="False" />
</AxisX2>
<AxisY2 Title="(%) Coef">
<MajorGrid Enabled="False" />
</AxisY2>
</asp:ChartArea>
</ChartAreas>
<Legends>
<asp:Legend Name="Legend1" Alignment="Center" Docking="Bottom">
</asp:Legend>
</Legends>
<Titles>
<asp:Title Font="Arial Narrow, 14pt" Name="Title1">
</asp:Title>
</Titles>
</asp:Chart>
Как видите, у меня установлен ObjectDataSource2 для заполнения ряда и, следовательно, диаграммы. Я уже пытался связываться с интервальными вещами и всем, но я не мог добиться того, чего хочу.
Это картина того, что я получил так далеко:
http://i.imgur.com/frJ22ns.png
Напомним: мне нужен этот график, чтобы отобразить только то, что я возвращаю из своей процедуры. Я знаю, что проблема в свойствах интервала оси (интервал ежемесячно, интервал = 1 и т. Д.), Но я просто не могу найти способ обойти.
Если кто-то прошел через нечто подобное и может иметь несколько указателей, это было бы здорово!
Заранее спасибо!!!
[EDITED]
Я стал немного ближе к тому, чего мне нужно достичь.
Проверьте эту картину:
http://i.imgur.com/EFrjcQF.png
Я добавил это к оси X (среди других модификаций свойств, но это то, что сработало):
<AxisX IntervalAutoMode="VariableCount" Interval="0">
... и он "пропускает" несколько месяцев сам по себе. Не знаю, куда идти, но я ищу в приложении WebSamples, скачанном с MSDN (не могу найти ссылку, извините), возможно, что-то там есть.
1 ответ
Ну, вот и все.
Я решил переписать все это без использования ObjectDataSource. Я снял все свойства объекта Chart4 (все эти интервалы, ежемесячные данные и еще много чего) и написал все, что написано в коде. Я также должен был отформатировать ось X соответственно.
PS: Я чувствую себя немного глупо, потому что я не продумал это до конца, и это не выглядит красиво, но так как я боролся в течение трех дней подряд, мне придется это делать. Как только у меня будет время, я переформулирую и сделаю его более элегантным и эффективным. Кроме того, мне очень жаль, что это VB.NET, у меня не было слов о выборе языка, смеется.
Проверьте это:
<asp:Chart ID="Chart4" runat="server" CssClass="Chart" BorderlineDashStyle="DashDotDot" Palette="Pastel"
ImageStorageMode="UseImageLocation" Height="650px">
<Legends>
<asp:Legend Name="Legend1" Alignment="Center" Docking="Bottom">
</asp:Legend>
</Legends>
<Titles>
<asp:Title Font="Arial Narrow, 14pt" Name="Title1">
</asp:Title>
</Titles>
</asp:Chart>
В конце концов, это то, что я сделал:
Dim date As String
Dim value As Double
Dim coef As Double
Dim chartArea As New ChartArea("chartEficOp")
chartArea.BackColor = Drawing.Color.Transparent
chartArea.ShadowOffset = 5
Dim valueSeries As New Series("valueY")
valueSeries.ChartArea = "chartEficOp"
valueSeries.Color = System.Drawing.ColorTranslator.FromHtml("#4f81bd")
valueSeries.YAxisType = AxisType.Primary
valueSeries.IsValueShownAsLabel = True
valueSeries.ChartType = SeriesChartType.Column
valueSeries.Legend = "Legend1"
valueSeries.YValueType = ChartValueType.Double
Dim serieEfic As New Series("valueY2")
coefSeries.ChartArea = "chartEficOp"
coefSeries.Color = System.Drawing.ColorTranslator.FromHtml("#9bbb59")
coefSeries.YAxisType = AxisType.Secondary
coefSeries.IsValueShownAsLabel = True
coefSeries.ChartType = SeriesChartType.Line
coefSeries.Legend = "Legend1"
coefSeries.YValueType = ChartValueType.Double
coefSeries.BorderWidth = 4
coefSeries.LabelFormat = "{0:0.##\%}"
Dim targetSerie As New Series("0,15%")
targetSerie.ChartArea = "chartEficOp"
targetSerie.Color = System.Drawing.Color.Red
targetSerie.YAxisType = AxisType.Secondary
targetSerie.IsValueShownAsLabel = False
targetSerie.ChartType = SeriesChartType.Line
targetSerie.Legend = "Legend1"
targetSerie.YValueType = ChartValueType.Double
targetSerie.BorderWidth = 2
targetSerie.BorderDashStyle = ChartDashStyle.Dash
Dim dt as DataTable = <called the stored proc here>
For Each item As DataRow In dt.Rows
date = String.Format("{0:MMM/yy}", item("DATA"))
Select Case <date here, to sort the x-label out>
Case "01/01/2013"
If date = "jan/11" Then
date = "2011"
ElseIf date = "jan/12" Then
date = "2012"
End If
Case "01/01/2012"
If date = "jan/11" Then
date = "2011"
End If
End Select
value = item("VALUE")
coef = item("COEF")
valueSeries.Points.AddXY(date, value)
coefSeries.Points.AddXY(date, coef)
targetSerie.Points.AddXY(date, 0.15)
Next
Chart4.ChartAreas.Add(chartArea)
Chart4.Series.Add(valueSeries)
Chart4.Series.Add(coefSeries)
Chart4.Series.Add(targetSerie)
Chart4.ChartAreas(0).AxisX.MajorGrid.Enabled = False
Chart4.ChartAreas(0).AxisX.Interval = 1
Chart4.ChartAreas(0).AxisY.MajorGrid.Enabled = False
Chart4.ChartAreas(0).AxisY.Title = "US$ / 1000"
Chart4.ChartAreas(0).AxisY2.MajorGrid.Enabled = False
Chart4.ChartAreas(0).AxisY2.Title = "% Cost"
Chart4.ChartAreas(0).AxisY2.Interval = 0.04
... и результат был:
http://i.imgur.com/fVpXSmG.png
Надеюсь, это поможет кому-то в будущем.