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

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

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

ChartのX軸のタイトル表示

[トピック内 48 記事 (1 - 20 表示)]  << 0 | 1 | 2 >>

■86333 / inTopicNo.1)  ChartのX軸のタイトル表示
  
□投稿者/ mako (1回)-(2018/01/19(Fri) 14:44:26)

分類:[VB.NET/VB2005 以降] 

ChartのX軸に時刻をとっています。
それを自動表示しますとそのタイトルには中途半端な時刻表示となります。
これを「30分おき」や「1時間おき」などと分かり易く固定をし、表示をしたいのですがその方法が分かりません。
なお、このデータは24時間連続してあるのではなく、昼休み等はその時刻を含むデータすらも存在しません。

引用返信 編集キー/
■86344 / inTopicNo.2)  Re[1]: ChartのX軸のタイトル表示
□投稿者/ shu (1077回)-(2018/01/22(Mon) 10:22:23)
No86333 (mako さん) に返信

サンプルです。

        _tbl = New DataTable()
        With _tbl.Columns
            .Add("t", GetType(DateTime))
            .Add("y", GetType(Integer))
        End With

        With _tbl.Rows
            .Add(Date.Today.AddHours(10).AddMinutes(15), 1)
            .Add(Date.Today.AddHours(10).AddMinutes(20), 2)
            .Add(Date.Today.AddHours(11).AddMinutes(15), 3)
            .Add(Date.Today.AddHours(13).AddMinutes(15), 4)
            .Add(Date.Today.AddHours(13).AddMinutes(20), 5)
        End With

        Chart1.DataSource = _tbl
        With Chart1.ChartAreas(0)
            With .AxisX
                .Minimum = Date.Today.ToOADate
                .Maximum = Date.Today.AddDays(1).ToOADate
                .IntervalType = DataVisualization.Charting.DateTimeIntervalType.Minutes
                .Interval = 30
                With .LabelStyle
                    .IntervalType = DataVisualization.Charting.DateTimeIntervalType.Minutes
                    .Interval = 30
                    .Format = "HH:mm"
                End With
            End With
        End With
        With Chart1.Series(0)
            .XValueMember = "t"
            .YValueMembers = "y"
        End With

引用返信 編集キー/
■86356 / inTopicNo.3)  Re[2]: ChartのX軸のタイトル表示
□投稿者/ mako (2回)-(2018/01/22(Mon) 16:44:10)
No86344 (shu さん) に返信

言葉足らずですみません。

質問にも書きましたように、
データは24時間連続してあるのではなく、昼休み等はその時刻を含むデータすらも存在しないのです。

従って、単に30分おきでの表示ではなく、データすらも存在しない分は表示をしたくないのです。
引用返信 編集キー/
■86357 / inTopicNo.4)  Re[3]: ChartのX軸のタイトル表示
□投稿者/ shu (1079回)-(2018/01/22(Mon) 17:57:05)
No86356 (mako さん) に返信
> ■No86344 (shu さん) に返信
>
> 言葉足らずですみません。
>
> 質問にも書きましたように、
> データは24時間連続してあるのではなく、昼休み等はその時刻を含むデータすらも存在しないのです。
>
> 従って、単に30分おきでの表示ではなく、データすらも存在しない分は表示をしたくないのです。
表示したくないということはどのように表示をするのでしょうか?
最小値、最大値の範囲を変えることは可能だと思いますが間のものは部分的に表示しないということは
グラフとしておかしなことになる気がします。どんなデータでどんなグラフを表示したいのかもう少し
詳しく提示された方が良いかと思います。
引用返信 編集キー/
■86376 / inTopicNo.5)  Re[4]: ChartのX軸のタイトル表示
□投稿者/ mako (3回)-(2018/01/24(Wed) 01:01:56)
No86357 (shu さん) に返信

X軸の時刻を分かり易く表示したいのです。
開始時刻からの起算ではなく、あくまでも時計としての。
ただし如何に時計としてであってもデータすらも無い時刻は非表示。

例えば下記のような15分おきのデータがあったとします。
      時刻 個数
 0    8:45    30
 1   9:00  20
 2    9:15    20
 3    9:30     5
 4    9:45    10
 5   10:00    15
(この間は時刻を含むデータすらも無し)
 6   11:15     5
 7   11:30    20
 8   11:45     5
 9   12:00    10
11   12:15    20

このような場合での30分おきですとX軸の時刻表示は、
開始の8:45 は 30分おきとは関係なく表示。
あと 9:00 9:30 10:00 11:30 12:00 も表示。
ただし10:30 11:00 は 時刻を含むデータすらも無いのですから非表示。

これと同じことは暦でも言えます。
例えば1月ですと31日までありますが2月は28日です。
当然2月は29〜31日は無い訳ですから非表示となります。
実際はそれプラス土日や祝祭日も非表示となります。

ちなみに普通に使われてるグラフもそのような表示となっています。

引用返信 編集キー/
■86377 / inTopicNo.6)  Re[5]: ChartのX軸のタイトル表示
□投稿者/ shu (1080回)-(2018/01/24(Wed) 07:26:08)
No86376 (mako さん) に返信

                Dim isFirst = True
                For Each row In _tbl.Select("", "t")
                    Dim dt = row.Field(Of Date)("t")
                    If isFirst OrElse dt.Minute = 0 OrElse dt.Minute = 30 Then
                        With .CustomLabels.Add(dt.AddMinutes(-3).ToOADate, dt.AddMinutes(3).ToOADate, dt.ToString("HH:mm"))
                            .RowIndex = 0
                        End With
                    End If
                    isFirst = False
                Next

引用返信 編集キー/
■86378 / inTopicNo.7)  Re[6]: ChartのX軸のタイトル表示
□投稿者/ mako (4回)-(2018/01/24(Wed) 08:38:07)
No86377 (shu さん) に返信

すみません。
以前教えていただいた No86344 のどの部分の差し替えですか? 

> ■No86376 (mako さん) に返信
> 
>                 Dim isFirst = True
>                 For Each row In _tbl.Select("", "t")
>                     Dim dt = row.Field(Of Date)("t")
>                     If isFirst OrElse dt.Minute = 0 OrElse dt.Minute = 30 Then
>                         With .CustomLabels.Add(dt.AddMinutes(-3).ToOADate, dt.AddMinutes(3).ToOADate, dt.ToString("HH:mm"))
>                             .RowIndex = 0
>                         End With
>                     End If
>                     isFirst = False
>                 Next
> 

引用返信 編集キー/
■86379 / inTopicNo.8)  Re[7]: ChartのX軸のタイトル表示
□投稿者/ shu (1081回)-(2018/01/24(Wed) 09:41:44)
No86378 (mako さん) に返信
> ■No86377 (shu さん) に返信
>
> すみません。
> 以前教えていただいた No86344 のどの部分の差し替えですか?
>
LabelStyleの設定の代わりの処理となります。
引用返信 編集キー/
■86380 / inTopicNo.9)  Re[5]: ChartのX軸のタイトル表示
□投稿者/ 魔界の仮面弁士 (1548回)-(2018/01/24(Wed) 10:59:59)
No86376 (mako さん) に返信
> 例えば下記のような15分おきのデータがあったとします。
> 9 12:00 10
>11 12:15 20
「10」が欠落しているのには、何か意図がありますか?


> あと 9:00 9:30 10:00 11:30 12:00 も表示。
09:15 と 09:45 と 10:00 と 12:00 のデータがあって、
09:00 と 09:30 と 11:30 のデータの無いデータ系列の場合、
9:00 / 9:30 / 10:00 には一切出力しないのでしょうか。
それとも前後のデータから想定値を出力するのでしょうか。


Dim ds As New DataSet("mako")

Dim tRaw As New DataTable("raw")
tRaw.Columns.Add("時刻", GetType(Date))
tRaw.Columns.Add("個数", GetType(Integer))
tRaw.Rows.Add(#1/19/2018 8:45#, 30)
tRaw.Rows.Add(#1/19/2018 9:00#, 20)
tRaw.Rows.Add(#1/19/2018 9:15#, 20)
tRaw.Rows.Add(#1/19/2018 9:30#, 5)
tRaw.Rows.Add(#1/19/2018 9:45#, 10)
tRaw.Rows.Add(#1/19/2018 10:00#, 15)
tRaw.Rows.Add(#1/19/2018 11:15#, 5)
tRaw.Rows.Add(#1/19/2018 11:30#, 20)
tRaw.Rows.Add(#1/19/2018 11:45#, 5)
tRaw.Rows.Add(#1/19/2018 12:00#, 10)
tRaw.Rows.Add(#1/19/2018 12:15#, 20)
tRaw.AcceptChanges()
ds.Tables.Add(tRaw)

Chart1.Titles.Clear()
Chart1.ChartAreas.Clear()
Chart1.Legends.Clear()
Chart1.Series.Clear()

Dim c15 As New ChartArea("15分エリア")
Dim c30 As New ChartArea("30分エリア")
Dim c60 As New ChartArea("60分エリア")
Chart1.ChartAreas.Add(c15)
Chart1.ChartAreas.Add(c30)
Chart1.ChartAreas.Add(c60)
c15.AxisX.Interval = 1.0
c30.AxisX.Interval = 1.0#
c60.AxisX.Interval = 1.0R

Dim c15sr1 As New Series("15分系列") With {.ChartArea = c15.Name}
Dim c30sr1 As New Series("30分系列") With {.ChartArea = c30.Name}
Dim c60sr1 As New Series("60分系列") With {.ChartArea = c60.Name}
Chart1.Series.Add(c15sr1)
Chart1.Series.Add(c30sr1)
Chart1.Series.Add(c60sr1)
c15sr1.ChartType = SeriesChartType.Spline
c30sr1.ChartType = SeriesChartType.Column
c60sr1.ChartType = SeriesChartType.Point

Dim q = tRaw.AsEnumerable() _
  .OrderBy(Function(r) r.Field(Of Date)("時刻")) _
  .Select(Function(r, RowIndex) New With {
    Key RowIndex,
    Key r.Field(Of Date)("時刻").Minute,
    Key .X = r.Field(Of Date)("時刻").ToString("HH:mm"),
    Key .Y = r.Field(Of Integer)("個数")
  })
For Each r In q
 If r.RowIndex = 0 OrElse r.Minute = 0 Then
  c15sr1.Points.AddXY(r.X, r.Y)
  c30sr1.Points.AddXY(r.X, r.Y)
  c60sr1.Points.AddXY(r.X, r.Y)
 ElseIf r.Minute = 15 OrElse r.Minute = 45 Then
  c15sr1.Points.AddXY(r.X, r.Y)
 ElseIf r.Minute = 30 Then
  c15sr1.Points.AddXY(r.X, r.Y)
  c30sr1.Points.AddXY(r.X, r.Y)
 End If
Next
引用返信 編集キー/
■86399 / inTopicNo.10)  Re[6]: ChartのX軸のタイトル表示
□投稿者/ mako (5回)-(2018/01/25(Thu) 20:32:02)
No86380 (魔界の仮面弁士 さん) に返信

> 「10」が欠落しているのには、何か意図がありますか?
すみません、10の間違えでした。

>>あと 9:00 9:30 10:00 11:30 12:00 も表示。
> 09:15 と 09:45 と 10:00 と 12:00 のデータがあって、
> 09:00 と 09:30 と 11:30 のデータの無いデータ系列の場合、
> 9:00 / 9:30 / 10:00 には一切出力しないのでしょうか。
> それとも前後のデータから想定値を出力するのでしょうか。
想定値での出力はありません。


ありがとうごさいます。
従って、チャートは希望通りになっています。
ただ、15分・30分・60分等の切り替えは RadioButton でしたいとこもあるのです。



引用返信 編集キー/
■86400 / inTopicNo.11)  Re[8]: ChartのX軸のタイトル表示
□投稿者/ mako (6回)-(2018/01/25(Thu) 20:35:56)
No86379 (shu さん) に返信

> LabelStyleの設定の代わりの処理となります。

多分使い方を間違えてるのでしょうが、
差し替えましたが時刻表示が消えグラフ部分は程んと変わりませんでした。


なお、Chartとしては #86380 仮面弁士さんのが希望通りになっています。
引用返信 編集キー/
■86401 / inTopicNo.12)  Re[9]: ChartのX軸のタイトル表示
□投稿者/ shu (1083回)-(2018/01/25(Thu) 23:47:30)
No86400 (mako さん) に返信
> ■No86379 (shu さん) に返信
>
>>LabelStyleの設定の代わりの処理となります。
>
> 多分使い方を間違えてるのでしょうが、
> 差し替えましたが時刻表示が消えグラフ部分は程んと変わりませんでした。
>
>
グラフ部分をどうするのか書かれていないので正しいのか間違っているのかわかりません。
どういう表示を行う為に何をどう記述したがどこがどう違うのか示さないと適切な
回答は得にくいものかと思います。
引用返信 編集キー/
■86402 / inTopicNo.13)  Re[7]: ChartのX軸のタイトル表示
□投稿者/ 魔界の仮面弁士 (1551回)-(2018/01/26(Fri) 10:09:48)
2018/01/26(Fri) 10:16:19 編集(投稿者)

No86399 (mako さん) に返信
> ただ、15分・30分・60分等の切り替えは RadioButton でしたいとこもあるのです。

No86380 のフォームに RadioButton (または CheckBox) を 3 つ貼り付け、下記を試してみてください。


Private Sub RadioButtons_CheckedChanged(sender As Object, e As EventArgs) _
 Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged, RadioButton3.CheckedChanged

 If Chart1.ChartAreas.Count = 3 Then
  Chart1.ChartAreas("15分エリア").Visible = RadioButton1.Checked
  Chart1.ChartAreas("30分エリア").Visible = RadioButton2.Checked
  Chart1.ChartAreas("60分エリア").Visible = RadioButton3.Checked
 End If
End Sub
引用返信 編集キー/
■86436 / inTopicNo.14)  Re[10]: ChartのX軸のタイトル表示
□投稿者/ mako (7回)-(2018/01/29(Mon) 12:34:55)
No86401 (shu さん) に返信

質問が下手ですみませんでした。
引用返信 編集キー/
■86437 / inTopicNo.15)  Re[8]: ChartのX軸のタイトル表示
□投稿者/ mako (8回)-(2018/01/29(Mon) 12:38:59)
No86402 (魔界の仮面弁士 さん) に返信

ありがとうございます。

実は後になってしまったのすが、こちらのプログラムが↓のサンプルのようになってるんです。
これを何とか基本に使いたのですが難しいでしょうか?


        ' == Chart1の表示 ==
        Dim ds As New DataSet
        Dim dt As New DataTable
        Dim tRaw As DataRow
        '列の作成
        dt.Columns.Add("時刻", GetType(String))  '文字列
        dt.Columns.Add("数量1", GetType(Integer))
        dt.Columns.Add("数量2", GetType(Integer))
        ds.Tables.Add(dt)
        'データのセット
        tRaw = ds.Tables(0).NewRow
        tRaw(0) = "8:45"      '時刻
        tRaw(1) = 30          '数量1
        tRaw(2) = 2           '数量2
        ds.Tables(0).Rows.Add(tRaw)

        tRaw = ds.Tables(0).NewRow
        tRaw(0) = "9:00"      '時刻
        tRaw(1) = 20          '数量1
        tRaw(2) = 3           '数量2
        ds.Tables(0).Rows.Add(tRaw)

        tRaw = ds.Tables(0).NewRow
        tRaw(0) = "9:15"      '時刻
        tRaw(1) = 20          '数量1
        tRaw(2) = 3           '数量2
        ds.Tables(0).Rows.Add(tRaw)

        tRaw = ds.Tables(0).NewRow
        tRaw(0) = "9:30"      '時刻
        tRaw(1) = 5           '数量1
        tRaw(2) = 4           '数量2
        ds.Tables(0).Rows.Add(tRaw)

        tRaw = ds.Tables(0).NewRow
        tRaw(0) = "9:45"      '時刻
        tRaw(1) = 10          '数量1
        tRaw(2) = 8           '数量2
        ds.Tables(0).Rows.Add(tRaw)

        tRaw = ds.Tables(0).NewRow
        tRaw(0) = "10:00"     '時刻
        tRaw(1) = 15          '数量1
        tRaw(2) = 10          '数量2
        ds.Tables(0).Rows.Add(tRaw)

        tRaw = ds.Tables(0).NewRow
        tRaw(0) = "11:15"     '時刻
        tRaw(1) = 5           '数量1
        tRaw(2) = 3           '数量2
        ds.Tables(0).Rows.Add(tRaw)

        tRaw = ds.Tables(0).NewRow
        tRaw(0) = "11:30"     '時刻
        tRaw(1) = 20          '数量1
        tRaw(2) = 15          '数量2
        ds.Tables(0).Rows.Add(tRaw)

        tRaw = ds.Tables(0).NewRow
        tRaw(0) = "11:45"     '時刻
        tRaw(1) = 5           '数量1
        tRaw(2) = 3           '数量2
        ds.Tables(0).Rows.Add(tRaw)

        tRaw = ds.Tables(0).NewRow
        tRaw(0) = "12:00"     '時刻
        tRaw(1) = 10          '数量1
        tRaw(2) = 8           '数量2
        ds.Tables(0).Rows.Add(tRaw)

        tRaw = ds.Tables(0).NewRow
        tRaw(0) = "12:15"     '時刻
        tRaw(1) = 20          '数量1
        tRaw(2) = 10          '数量2
        ds.Tables(0).Rows.Add(tRaw)

        'Chart に表示するデータソースを設定
        Chart1.DataSource = ds
        Chart1.Series.Clear()
        '
        Dim ore = Chart1.Series.Add("折れ線")
        With ore
            .ChartType = DataVisualization.Charting.SeriesChartType.Line
            .XValueMember = "時刻"
            .YValueMembers = "数量1"
        End With

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

    '15分・30分・60分に選択切り替え
    Private Sub RadioButtons_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged, RadioButton3.CheckedChanged
        If RadioButton1.Checked = True Then
            '上段のChart1の表示を15分にて表示再表示
        End If
        If RadioButton2.Checked = True Then
            '上段のChart1の表示を30分にて表示再表示
        End If
        If RadioButton3.Checked = True Then
            '上段のChart1の表示を60分にて表示再表示
        End If
    End Sub

引用返信 編集キー/
■86438 / inTopicNo.16)  Re[11]: ChartのX軸のタイトル表示
□投稿者/ shu (1084回)-(2018/01/29(Mon) 13:17:06)
No86436 (mako さん) に返信


若干違うかもしれませんが
以下のようにNullの要素を追加するとそこだけデータがプロットされません。
時間の項目に文字列を使うのはグラフ上扱いにくいのでグラフ用のDataTableを
用意されて時間項目はDateTime型にされた方がよいです。
DataTable1つの場合はDataSetを使う必要はなくDataTable直接でよいです。

        _tbl = New DataTable()
        With _tbl.Columns
            .Add("t", GetType(DateTime))
            .Add("y1", GetType(Integer))
            .Add("y2", GetType(Integer))
        End With

        With _tbl.Rows
            .Add(Date.Today.AddHours(8).AddMinutes(45), 30, 2)
            .Add(Date.Today.AddHours(9).AddMinutes(0), 20, 3)
            .Add(Date.Today.AddHours(9).AddMinutes(15), 20, 3)
            .Add(Date.Today.AddHours(9).AddMinutes(30), 5, 4)
            .Add(Date.Today.AddHours(9).AddMinutes(45), 10, 8)
            .Add(Date.Today.AddHours(10).AddMinutes(0), 15, 10)
            .Add(Date.Today.AddHours(10).AddMinutes(15), DBNull.Value, DBNull.Value)
            .Add(Date.Today.AddHours(10).AddMinutes(30), DBNull.Value, DBNull.Value)
            .Add(Date.Today.AddHours(11).AddMinutes(15), 5, 3)
            .Add(Date.Today.AddHours(11).AddMinutes(30), 20, 15)
            .Add(Date.Today.AddHours(11).AddMinutes(45), 5, 3)
            .Add(Date.Today.AddHours(12).AddMinutes(0), 10, 8)
            .Add(Date.Today.AddHours(12).AddMinutes(15), 20, 10)
        End With

        Chart1.DataSource = _tbl
        With Chart1.ChartAreas(0)
            With .AxisX
                .Minimum = Date.Today.AddHours(8).AddMinutes(45).ToOADate
                .Maximum = Date.Today.AddHours(12).AddMinutes(15).ToOADate
                .IntervalType = DataVisualization.Charting.DateTimeIntervalType.Minutes
                .Interval = 30


                Dim isFirst = True
                For Each row In _tbl.Select("", "t")
                    Dim dt = row.Field(Of Date)("t")
                    If isFirst OrElse dt.Minute = 0 OrElse dt.Minute = 30 Then
                        With .CustomLabels.Add(dt.AddMinutes(-3).ToOADate, dt.AddMinutes(3).ToOADate, dt.ToString("HH:mm"))
                            .RowIndex = 0
                        End With
                    End If
                    isFirst = False
                Next


            End With
        End With
        With Chart1.Series(0)
            .XValueMember = "t"
            .YValueMembers = "y1"
        End With
        With Chart1.Series.Add("")
            .ChartType = SeriesChartType.Line
            .EmptyPointStyle.Color = Color.Transparent
            .XValueMember = "t"
            .YValueMembers = "y2"
        End With

引用返信 編集キー/
■86440 / inTopicNo.17)  Re[12]: ChartのX軸のタイトル表示
□投稿者/ mako (9回)-(2018/01/29(Mon) 16:47:28)
No86438 (shu さん) に返信

ありがとうございます。

実行してみたのですが、
・08:45と12:15の棒グラフの棒、即ちデータの最初と最後の時刻の棒表示が半分になります。
・09:00と09:30の間、09:30と10:00の間にも、もう一本の数量の棒が立ってしまいます。
・10:00と11:30の間に空白もでき、かつ10:30の時刻表示もされます。
など。。

時間項目はデータがテキスト(.csv)となってますのでそのままを使っています。


なお、No86437 に今使ってるプログラムのサンプルを載せましたのでもしよかったらお願いします。
引用返信 編集キー/
■86441 / inTopicNo.18)  Re[13]: ChartのX軸のタイトル表示
□投稿者/ shu (1085回)-(2018/01/29(Mon) 17:34:57)
No86440 (mako さん) に返信
> ■No86438 (shu さん) に返信
>
> ありがとうございます。
>
> 実行してみたのですが、
> ・08:45と12:15の棒グラフの棒、即ちデータの最初と最後の時刻の棒表示が半分になります。
minimumに設定する時間を調整して、8:30にするとよいかと思います。

> ・09:00と09:30の間、09:30と10:00の間にも、もう一本の数量の棒が立ってしまいます。
> ・10:00と11:30の間に空白もでき、かつ10:30の時刻表示もされます。
> など。。
表示したい時間単位でデータを作るようにして値がないところはDBNull.Valueを設定するようにしてみて下さい。

9:00と9:30の間に9:15のデータ、9:30と10:00の間に9:45のデータがあるのでこれをグラフに出したくなければDataTableへ
追加するのをやめれば表示されないです。



引用返信 編集キー/
■86469 / inTopicNo.19)  Re[1]: ChartのX軸のタイトル表示
□投稿者/ mako (10回)-(2018/01/31(Wed) 17:00:32)
お世話になっています。

今、使ってるプログラムは下記のようなものですが実際のはもっと複雑ですので、あまり大きく変えたくないとこもあります。
それプラス、我流ですが1分間隔のサンプルデータも作ってみました。
よろしくお願いします。


表示時刻の切り替えは、 RadioButton等 でしチャートを再表示しています。
チャートによっては9:00・11:00と言った時間単位もありますし、別のデータにはなりますが日にちの場合もあります。

サンプルデータでの時刻表示は、
 15分間隔場合は  8:15・8:30・8:45・10:30・10:45 と 起点の8:10と10:20
 30分間隔場合は  8:30 10:30 と 起点の8:10と10:20 
 60分間隔場合は  起点の8:10と10:20のみ
 9:00・11:0などと言った時間単位の場合は、起点の8:10と10:20のみ
となります。

もし可能でしたら見易くするために、起点の8:10と10:20の左側に棒グラフ2〜3本くらいの空白も。


    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(ByVal sender As System.Object, ByVal e As System.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).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).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 に表示するデータソースを設定
        Chart1.DataSource = ds
        Chart1.Series.Clear()
        '
        Dim ore = Chart1.Series.Add("折れ線")
        With ore
            .ChartType = DataVisualization.Charting.SeriesChartType.Line
            .XValueMember = "時刻"
            .YValueMembers = "数量1"
        End With

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


引用返信 編集キー/
■86471 / inTopicNo.20)  Re[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

引用返信 編集キー/

このトピックをツリーで一括表示

次の20件>
トピック内ページ移動 / << 0 | 1 | 2 >>

管理者用

- Child Tree -