.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

Надеюсь, это поможет кому-то в будущем.

Другие вопросы по тегам