C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■86471 / 2階層)  ChartのX軸のタイトル表示
□投稿者/ shu (1087回)-(2018/02/01(Thu) 09:44:10)
No86469 (mako さん) に返信


提示されたコードに手を加えたものです。サンプルデータ作成時のStr関数によるものはスペースがふくまれてしまうので
記述を変更させていただきました。

時間毎にグループ化し最初のデータはかならず出力しそれ以外はインターバルに合った時間のもののみ対象とするようにしてあります。


Public Class Form1
    Private Structure datF
        Dim Jikoku As String      '時刻 (実際は "2018/01/30 16:30:00" などの日付も入った文字列)
        Dim Suu1 As Integer       '数量1
        Dim Suu2 As Integer       '数量2
    End Structure
    Dim Uridat(500) As datF
    Dim datS As Integer            '

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' 1分間隔のサンプルデータをを成
        datS = -1
        For i = 10 To 45    ' 8:10〜8:45
            datS = datS + 1
            'Uridat(datS).Jikoku = "8:" & Str(i)  '時刻
            Uridat(datS).Jikoku = $"8:{i:00}"  '時刻
            Uridat(datS).Suu1 = i * 10           '数量1
            Uridat(datS).Suu2 = i * 5            '数量2
        Next
        For i = 20 To 55        ' 10:20〜10:55
            datS = datS + 1
            'Uridat(datS).Jikoku = "10:" & Str(i)   '時刻
            Uridat(datS).Jikoku = $"10:{i:00}"   '時刻
            Uridat(datS).Suu1 = i + 100            '数量1
            Uridat(datS).Suu2 = i + 20             '数量2
        Next

        '====   Chart1   ====
        Dim ds As New DataSet
        Dim dt As New DataTable
        Dim dtRow As DataRow

        '列の作成
        With dt.Columns
            .Add("時刻", GetType(String))
            .Add("数量1", GetType(Integer))
            .Add("数量2", GetType(Integer))
        End With
        ds.Tables.Add(dt)

        'データのセット
        For i = 0 To datS
            dtRow = ds.Tables(0).NewRow
            dtRow(0) = Uridat(i).Jikoku    '時刻
            dtRow(1) = Uridat(i).Suu1      '数量1
            dtRow(2) = Uridat(i).Suu2      '数量2
            ds.Tables(0).Rows.Add(dtRow)
        Next

        'Chart に表示するデータソースを設定
        Dim min As DateTime = Nothing
        Dim max As DateTime = Nothing
        Dim intr = 30
        Dim tbl = GetChartDs(ds, intr, min, max)
        Chart1.DataSource = tbl.Select("", "時刻")
        Chart1.Series.Clear()
        '
        With Chart1.ChartAreas(0)
            With .AxisX
                .Minimum = min.ToOADate
                .Maximum = max.ToOADate
                .IntervalType = DataVisualization.Charting.DateTimeIntervalType.Minutes
                .Interval = intr

                Dim isFirst = True
                For Each row In tbl.Select("", "時刻")
                    Dim d = row.Field(Of Date)("時刻")
                    Dim null = row.IsNull("数量1")
                    If Not null Then
                        With .CustomLabels.Add(d.AddMinutes(-intr \ 3).ToOADate, d.AddMinutes(intr \ 3).ToOADate, d.ToString("HH:mm"))
                            .RowIndex = 0
                        End With
                    End If
                    isFirst = False
                Next
            End With
        End With

        Dim ore = Chart1.Series.Add("折れ線")
        With ore
            .ChartType = DataVisualization.Charting.SeriesChartType.Line
            .EmptyPointStyle.SetDefault(True)
            .XValueMember = "時刻"
            .YValueMembers = "数量1"
        End With

        Dim bou = Chart1.Series.Add("棒グラフ")
        With bou
            .ChartType = DataVisualization.Charting.SeriesChartType.Column
            .XValueMember = "時刻"
            .YValueMembers = "数量2"
        End With
    End Sub

    Private Function GetChartDs(Src As DataSet, IntrMin As Integer,
                                ByRef Min As DateTime, ByRef Max As DateTime) As DataTable
        Dim ret As New DataTable()
        Min = Nothing
        Max = Nothing

        With ret.Columns()
            .Add("時刻", GetType(DateTime))
            .Add("数量1", GetType(Integer))
            .Add("数量2", GetType(Integer))
        End With

        For Each itm In (From r In Src.Tables(0).Select()
                         Let d = Function(s As String) As Date
                                     Dim d2 As Date = Nothing
                                     If Date.TryParseExact(s, {"HH:mm", "H:m"}, Nothing, Nothing, d2) Then
                                         Return d2
                                     Else
                                         Return CDate(Nothing)
                                     End If
                                 End Function(r.Field(Of String)("時刻"))
                         Let h = d.Hour
                         Group By h Into rows = Group)

            Dim hour = itm.h
            Dim min2 As Date = Nothing
            For Each rowItm In itm.rows
                Dim row = rowItm.r
                Dim d = rowItm.d
                Dim disp = False
                If Min = Nothing OrElse d < Min Then Min = d : disp = True
                If Max = Nothing OrElse d > Max Then Max = d
                If min2 = Nothing OrElse d < min2 Then min2 = d : disp = True
                If Not disp Then
                    If d.Minute Mod IntrMin = 0 Then
                        disp = True
                    End If
                End If
                If disp Then
                    ret.Rows.Add(d, row("数量1"), row("数量2"))
                End If
            Next
        Next

        If Min <> Nothing Then
            Min = Min.AddMinutes(-(Min.Minute Mod IntrMin) - IntrMin * 2)
        End If
        If Max <> Nothing Then
            Max = Max.AddMinutes(-(Max.Minute Mod IntrMin) + IntrMin * 2)
        End If

        Dim d1 As Date = Min
        For Each row In ret.Select("", "時刻")
            Dim d2 = row.Field(Of Date)("時刻")
            Do While d1 < d2
                ret.Rows.Add(d1, DBNull.Value, DBNull.Value)
                d1 = d1.AddMinutes(IntrMin)
            Loop
            d1 = d2.AddMinutes(IntrMin)
        Next
        ret.AcceptChanges()

        Return ret
    End Function

End Class

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[1]: ChartのX軸のタイトル表示 /mako →Re[3]: ChartのX軸のタイトル表示 /mako
→Re[3]: ChartのX軸のタイトル表示 /mako
 
上記関連ツリー

ChartのX軸のタイトル表示 / mako (18/01/19(Fri) 14:44) #86333
Re[1]: ChartのX軸のタイトル表示 / shu (18/01/22(Mon) 10:22) #86344
│└ Re[2]: ChartのX軸のタイトル表示 / mako (18/01/22(Mon) 16:44) #86356
│  └ Re[3]: ChartのX軸のタイトル表示 / shu (18/01/22(Mon) 17:57) #86357
│    └ Re[4]: ChartのX軸のタイトル表示 / mako (18/01/24(Wed) 01:01) #86376
│      ├ Re[5]: ChartのX軸のタイトル表示 / shu (18/01/24(Wed) 07:26) #86377
│      │└ Re[6]: ChartのX軸のタイトル表示 / mako (18/01/24(Wed) 08:38) #86378
│      │  └ Re[7]: ChartのX軸のタイトル表示 / shu (18/01/24(Wed) 09:41) #86379
│      │    └ Re[8]: ChartのX軸のタイトル表示 / mako (18/01/25(Thu) 20:35) #86400
│      │      └ Re[9]: ChartのX軸のタイトル表示 / shu (18/01/25(Thu) 23:47) #86401
│      │        └ Re[10]: ChartのX軸のタイトル表示 / mako (18/01/29(Mon) 12:34) #86436
│      │          └ Re[11]: ChartのX軸のタイトル表示 / shu (18/01/29(Mon) 13:17) #86438
│      │            └ Re[12]: ChartのX軸のタイトル表示 / mako (18/01/29(Mon) 16:47) #86440
│      │              └ Re[13]: ChartのX軸のタイトル表示 / shu (18/01/29(Mon) 17:34) #86441
│      └ Re[5]: ChartのX軸のタイトル表示 / 魔界の仮面弁士 (18/01/24(Wed) 10:59) #86380
│        └ Re[6]: ChartのX軸のタイトル表示 / mako (18/01/25(Thu) 20:32) #86399
│          └ Re[7]: ChartのX軸のタイトル表示 / 魔界の仮面弁士 (18/01/26(Fri) 10:09) #86402
│            └ Re[8]: ChartのX軸のタイトル表示 / mako (18/01/29(Mon) 12:38) #86437
Re[1]: ChartのX軸のタイトル表示 / mako (18/01/31(Wed) 17:00) #86469
  └ ChartのX軸のタイトル表示 / shu (18/02/01(Thu) 09:44) #86471 ←Now
    ├ Re[3]: ChartのX軸のタイトル表示 / mako (18/02/01(Thu) 23:31) #86477
    │├ Re[4]: ChartのX軸のタイトル表示 / shu (18/02/02(Fri) 09:04) #86478
    │└ Re[4]: ChartのX軸のタイトル表示 / shu (18/02/02(Fri) 16:30) #86481
    │  └ Re[5]: ChartのX軸のタイトル表示 / mako (18/02/05(Mon) 12:17) #86484
    │    └ Re[6]: ChartのX軸のタイトル表示 / shu (18/02/05(Mon) 12:32) #86485
    │      └ Re[7]: ChartのX軸のタイトル表示 / mako (18/02/07(Wed) 07:57) #86499
    │        └ Re[8]: ChartのX軸のタイトル表示 / shu (18/02/07(Wed) 08:11) #86500
    │          └ Re[9]: ChartのX軸のタイトル表示 / mako (18/02/07(Wed) 16:49) #86516
    │            └ Re[10]: ChartのX軸のタイトル表示 / shu (18/02/07(Wed) 17:03) #86518
    │              └ Re[11]: ChartのX軸のタイトル表示 / mako (18/02/07(Wed) 18:36) #86520
    │                └ Re[12]: ChartのX軸のタイトル表示 / shu (18/02/08(Thu) 08:10) #86522
    │                  └ Re[13]: ChartのX軸のタイトル表示 / mako (18/02/08(Thu) 16:20) #86526
    │                    └ Re[14]: ChartのX軸のタイトル表示 / shu (18/02/08(Thu) 17:23) #86528
    │                      └ Re[15]: ChartのX軸のタイトル表示 / mako (18/02/08(Thu) 23:29) #86530
    │                        └ Re[16]: ChartのX軸のタイトル表示 / shu (18/02/09(Fri) 00:45) #86531
    │                          └ Re[17]: ChartのX軸のタイトル表示 / mako (18/02/09(Fri) 14:47) #86533
    │                            └ Re[18]: ChartのX軸のタイトル表示 / shu (18/02/09(Fri) 16:02) #86534
    │                              ├ Re[19]: ChartのX軸のタイトル表示 / mako (18/02/09(Fri) 22:43) #86538
    │                              └ Re[19]: ChartのX軸のタイトル表示 / mako (18/02/16(Fri) 16:46) #86580
    │                                └ Re[20]: ChartのX軸のタイトル表示 / shu (18/02/18(Sun) 00:14) #86586
    │                                  └New Re[21]: ChartのX軸のタイトル表示 / mako (18/02/18(Sun) 14:33) #86587
    │                                    └New Re[22]: ChartのX軸のタイトル表示 / shu (18/02/18(Sun) 21:01) #86588
    │                                      └New Re[23]: ChartのX軸のタイトル表示 / mako (18/02/19(Mon) 00:08) #86589
    └ Re[3]: ChartのX軸のタイトル表示 / mako (18/02/01(Thu) 23:29) #86476

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信