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

わんくま同盟

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

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

ツリー一括表示

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
  └ Re[2]: ChartのX軸のタイトル表示 /shu (18/02/01(Thu) 09:44) #86471
    ├ 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
    │                                └New 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
    └ Re[3]: ChartのX軸のタイトル表示 /mako (18/02/01(Thu) 23:29) #86476


親記事 / ▼[ 86344 ] ▼[ 86469 ]
■86333 / 親階層)  ChartのX軸のタイトル表示
□投稿者/ mako (1回)-(2018/01/19(Fri) 14:44:26)

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

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

[ □ Tree ] 返信 編集キー/

▲[ 86333 ] / ▼[ 86356 ]
■86344 / 1階層)  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

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86344 ] / ▼[ 86357 ]
■86356 / 2階層)  Re[2]: ChartのX軸のタイトル表示
□投稿者/ mako (2回)-(2018/01/22(Mon) 16:44:10)
No86344 (shu さん) に返信

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

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

従って、単に30分おきでの表示ではなく、データすらも存在しない分は表示をしたくないのです。
[ 親 86333 / □ Tree ] 返信 編集キー/

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

▲[ 86357 ] / ▼[ 86377 ] ▼[ 86380 ]
■86376 / 4階層)  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日は無い訳ですから非表示となります。
実際はそれプラス土日や祝祭日も非表示となります。

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

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86376 ] / ▼[ 86378 ]
■86377 / 5階層)  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

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86377 ] / ▼[ 86379 ]
■86378 / 6階層)  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
> 

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86378 ] / ▼[ 86400 ]
■86379 / 7階層)  Re[7]: ChartのX軸のタイトル表示
□投稿者/ shu (1081回)-(2018/01/24(Wed) 09:41:44)
No86378 (mako さん) に返信
> ■No86377 (shu さん) に返信
>
> すみません。
> 以前教えていただいた No86344 のどの部分の差し替えですか?
>
LabelStyleの設定の代わりの処理となります。
[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86379 ] / ▼[ 86401 ]
■86400 / 8階層)  Re[8]: ChartのX軸のタイトル表示
□投稿者/ mako (6回)-(2018/01/25(Thu) 20:35:56)
No86379 (shu さん) に返信

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

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


なお、Chartとしては #86380 仮面弁士さんのが希望通りになっています。
[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86400 ] / ▼[ 86436 ]
■86401 / 9階層)  Re[9]: ChartのX軸のタイトル表示
□投稿者/ shu (1083回)-(2018/01/25(Thu) 23:47:30)
No86400 (mako さん) に返信
> ■No86379 (shu さん) に返信
>
>>LabelStyleの設定の代わりの処理となります。
>
> 多分使い方を間違えてるのでしょうが、
> 差し替えましたが時刻表示が消えグラフ部分は程んと変わりませんでした。
>
>
グラフ部分をどうするのか書かれていないので正しいのか間違っているのかわかりません。
どういう表示を行う為に何をどう記述したがどこがどう違うのか示さないと適切な
回答は得にくいものかと思います。
[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86401 ] / ▼[ 86438 ]
■86436 / 10階層)  Re[10]: ChartのX軸のタイトル表示
□投稿者/ mako (7回)-(2018/01/29(Mon) 12:34:55)
No86401 (shu さん) に返信

質問が下手ですみませんでした。
[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86436 ] / ▼[ 86440 ]
■86438 / 11階層)  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

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86438 ] / ▼[ 86441 ]
■86440 / 12階層)  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 に今使ってるプログラムのサンプルを載せましたのでもしよかったらお願いします。
[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86440 ] / 返信無し
■86441 / 13階層)  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へ
追加するのをやめれば表示されないです。



[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86376 ] / ▼[ 86399 ]
■86380 / 5階層)  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
[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86380 ] / ▼[ 86402 ]
■86399 / 6階層)  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 でしたいとこもあるのです。



[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86399 ] / ▼[ 86437 ]
■86402 / 7階層)  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
[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86402 ] / 返信無し
■86437 / 8階層)  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

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86333 ] / ▼[ 86471 ]
■86469 / 1階層)  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


[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86469 ] / ▼[ 86477 ] ▼[ 86476 ]
■86471 / 2階層)  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

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86471 ] / ▼[ 86478 ] ▼[ 86481 ]
■86477 / 3階層)  Re[3]: ChartのX軸のタイトル表示
□投稿者/ mako (12回)-(2018/02/01(Thu) 23:31:53)
No86471 (shu さん) に返信

お世話になります。

Q1, 8:10〜8:45のデータ部分と10:20〜10:55のデータ無い部分の空白は、もう少し無くならないでしょうか?、

>         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

試しに、上をを下記にでもすると棒グラフも無い空白部分がさらに多くなります。

        For i = 20 To 55        ' 14:20〜14:55
            datS = datS + 1
            'Uridat(datS).Jikoku = "14:" & Str(i)   '時刻
            Uridat(datS).Jikoku = $"14:{i:00}"   '時刻
            Uridat(datS).Suu1 = i + 100            '数量1
            Uridat(datS).Suu2 = i + 20             '数量2
        Next


Q2, チャートの右端と左端の空白(棒グラフの無い部分)は無くならないでしょうか?

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86477 ] / 返信無し
■86478 / 4階層)  Re[4]: ChartのX軸のタイトル表示
□投稿者/ shu (1088回)-(2018/02/02(Fri) 09:04:14)
No86477 (mako さん) に返信
> ■No86471 (shu さん) に返信
>
> お世話になります。
>
> Q1, 8:10〜8:45のデータ部分と10:20〜10:55のデータ無い部分の空白は、もう少し無くならないでしょうか?、
>
指定した時間間隔でグラフが描画されているので8:45と10:20分の間が空けばそれだけ広がります。
それが普通のグラフだと思うのですが、何か違うのでしょうか?多分それが当初からmakoさんが回答されていないことだと
思います。
[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86477 ] / ▼[ 86484 ]
■86481 / 4階層)  Re[4]: ChartのX軸のタイトル表示
□投稿者/ shu (1089回)-(2018/02/02(Fri) 16:30:41)
No86477 (mako さん) に返信

時間帯が固まっていれば、その間の間隔は適当でよいということなのだと考えいかのように
してみましたがどうでしょう?


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 min = -1
        Dim max = -1
        Dim intr = 30
        Dim tbl = GetChartDs(ds, intr, min, max)
        Chart1.DataSource = tbl.Select("", "x")
        Chart1.Series.Clear()
        '
        With Chart1.ChartAreas(0)
            With .AxisX
                '.Minimum = min.ToOADate
                '.Maximum = max.ToOADate
                .Minimum = min
                .Maximum = max
                '.IntervalType = DataVisualization.Charting.DateTimeIntervalType.Minutes
                '.Interval = intr
                .Interval = 5

                For Each row In tbl.Select("", "時刻")
                    Dim null = row.IsNull("数量1")
                    If null Then Continue For
                    Dim d = row.Field(Of Date)("時刻")
                    Dim x = row.Field(Of Integer)("x")
                    With .CustomLabels.Add(x - 2, x + 2, d.ToString("HH:mm"))
                        .RowIndex = 0
                    End With
                Next
            End With
        End With

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

        Dim bou = Chart1.Series.Add("棒グラフ")
        With bou
            .ChartType = DataVisualization.Charting.SeriesChartType.Column
            '.XValueMember = "時刻"
            .XValueMember = "x"
            .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
    Private Function GetChartDs(Src As DataSet, IntrMin As Integer,
                                ByRef Min As Integer, ByRef Max As Integer) As DataTable
        Dim ret As New DataTable()
        Min = Nothing
        Max = Nothing

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

        Dim x = 1
        Min = x
        x = 5
        '一番左にスペース
        ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
        Dim isFirst2 = True
        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", "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
                         Order By d
                         Group By h Into rows = Group)
            '間
            If Not isFirst2 Then
                For i = 1 To 2
                    ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5

                Next
            End If
            isFirst2 = False

            Dim hour = itm.h
            'Dim min2 As Date = Nothing
            Dim isFirst = True
            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 isFirst Then disp = True : isFirst = False
                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"))
                    ret.Rows.Add(x, d, row("数量1"), row("数量2"))
                    x += 5
                End If
            Next
        Next
        Max = x

        '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

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86481 ] / ▼[ 86485 ]
■86484 / 5階層)  Re[5]: ChartのX軸のタイトル表示
□投稿者/ mako (13回)-(2018/02/05(Mon) 12:17:28)
No86481 (shu さん) に返信

お世話になります。

下記のような 10:20〜11:55 間は連続したサンプルデータがあったとします。
この場合はグラフも空白のない連続したものにはならないでしょうか?

また 8:10 の左の空白も要らないと言うことになります。

それと 2018/01/04〜2018/02/05 などと日付のデータの場合にも同様に使用が出来ますように。


        ' 8:10〜8:45           
        For i = 10 To 45        ' 8:10〜8:45
            datS = datS + 1
            Uridat(datS).Jikoku = $"8:{i:00}"    '時刻
            Uridat(datS).Suu1 = i * 10           '数量1
            Uridat(datS).Suu2 = i * 5            '数量2  
        Next

        ' 10:20〜11:55
        For i = 0 To 59        ' 10:20〜10:59
            datS = datS + 1
            Uridat(datS).Jikoku = $"10:{i:00}"     '時刻
            Uridat(datS).Suu1 = i + 100            '数量1
            Uridat(datS).Suu2 = i + 20             '数量2
        Next
        For i = 0 To 55        ' 11:00〜11:55
            datS = datS + 1
            Uridat(datS).Jikoku = $"11:{i:00}"     '時刻
            Uridat(datS).Suu1 = i + 100            '数量1
            Uridat(datS).Suu2 = i + 20             '数量2
        Next

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86484 ] / ▼[ 86499 ]
■86485 / 6階層)  Re[6]: ChartのX軸のタイトル表示
□投稿者/ shu (1090回)-(2018/02/05(Mon) 12:32:58)
No86484 (mako さん) に返信
> ■No86481 (shu さん) に返信
>
> お世話になります。
>
> 下記のような 10:20〜11:55 間は連続したサンプルデータがあったとします。
> この場合はグラフも空白のない連続したものにはならないでしょうか?
その場合は間のデータを作成しないようにするとよいかと思います。


> また 8:10 の左の空白も要らないと言うことになります。
minを8:10のところにすると既出の棒グラフが半分になる現象が発生しますがよろしいのでしょうか?
ぎりぎりにしたいのであればminを調整するとよいです。

makoさんのやりたいことすべてにお答えすることはこちらが開発することと同じになってしまいます。
ここで得られた情報をもとに自分なりのコーディングをされるとよいと思います。

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86485 ] / ▼[ 86500 ]
■86499 / 7階層)  Re[7]: ChartのX軸のタイトル表示
□投稿者/ mako (14回)-(2018/02/07(Wed) 07:57:20)
2018/02/07(Wed) 08:03:41 編集(投稿者)
No86485 (shu さん) に返信


連続した時間(分)の最初のデータのみに '*' マークを付けることで、空白の対処活用をすることは出来ないでしょうか?

    Private Structure datF
        Dim Jikoku As String      '時刻 (実際は "2018/01/30 16:30:00" などの日付も入った文字列)
        Dim Suu1 As Integer       '数量1
        Dim Suu2 As Integer       '数量2
        Dim mark As String        '連続した時間の最初のデータのみに '*' マークを付ける。
    End Structure
    Dim Uridat(500) As datF
    Dim datS As Integer          



        ' 8:10〜8:45           
        For i = 10 To 45        ' 8:10〜8:45
            datS = datS + 1
            Uridat(datS).mark = " "
            Uridat(datS).Jikoku = $"8:{i:00}"    '時刻
            Uridat(datS).Suu1 = i * 10           '数量1
            Uridat(datS).Suu2 = i * 5            '数量2 

            Uridat(datS).mark = " "
            If i = 10 Then
                Uridat(datS).mark = "*"          ' "*" マーク
            End If
        Next

        ' 10:20〜11:55
        For i = 0 To 59        ' 10:20〜10:59
            datS = datS + 1
            Uridat(datS).Jikoku = $"10:{i:00}"     '時刻
            Uridat(datS).Suu1 = i + 100            '数量1
            Uridat(datS).Suu2 = i + 20             '数量2

            Uridat(datS).mark = " "
            If i = 0 Then
                Uridat(datS).mark = "*"            ' "*" マーク
            End If
        Next
        For i = 0 To 55        ' 11:00〜11:55
            datS = datS + 1
            Uridat(datS).Jikoku = $"11:{i:00}"     '時刻
            Uridat(datS).Suu1 = i + 100            '数量1
            Uridat(datS).Suu2 = i + 20             '数量2

            Uridat(datS).mark = " "
        Next

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86499 ] / ▼[ 86516 ]
■86500 / 8階層)  Re[8]: ChartのX軸のタイトル表示
□投稿者/ shu (1092回)-(2018/02/07(Wed) 08:11:36)
No86499 (mako さん) に返信

> 
> 連続した時間(分)の最初のデータのみに '*' マークを付けることで、空白の対処活用をすることは出来ないでしょうか?
> 


スペースを入れるのは先の提示コードの
'間
            If Not isFirst2 Then
                For i = 1 To 2
                    ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5

                Next
            End If
この部分なのでその条件のときに実ポイントを追加する前に空白ポイントを追加すればよいです。



[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86500 ] / ▼[ 86518 ]
■86516 / 9階層)  Re[9]: ChartのX軸のタイトル表示
□投稿者/ mako (15回)-(2018/02/07(Wed) 16:49:05)
No86500 (shu さん) に返信

> スペースを入れるのは先の提示コードの
> '間
> If Not isFirst2 Then
> For i = 1 To 2
> ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
>
> Next
> End If
> この部分なのでその条件のときに実ポイントを追加する前に空白ポイントを追加すればよいです。
>

すみません。
それが関係してることは分かってたのですが、さてどう書けばいいのかが分かってません。





[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86516 ] / ▼[ 86520 ]
■86518 / 10階層)  Re[10]: ChartのX軸のタイトル表示
□投稿者/ shu (1093回)-(2018/02/07(Wed) 17:03:32)
No86516 (mako さん) に返信

>
> すみません。
> それが関係してることは分かってたのですが、さてどう書けばいいのかが分かってません。
>
例えば
ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
ret.Rows.Add(x, d, row("数量1"), row("数量2")) : x += 5
とした場合、どのようになるかわかりますか?
その状態と実際に行いたいこととの差が何なのかはっきりさせるとなんとかならないでしょうか?
[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86518 ] / ▼[ 86522 ]
■86520 / 11階層)  Re[11]: ChartのX軸のタイトル表示
□投稿者/ mako (16回)-(2018/02/07(Wed) 18:36:33)
No86518 (shu さん) に返信

> 例えば
>  ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
>  ret.Rows.Add(x, d, row("数量1"), row("数量2")) : x += 5
> とした場合、どのようになるかわかりますか?
> その状態と実際に行いたいこととの差が何なのかはっきりさせるとなんとかならないでしょうか?

            If Not isFirst2 Then
                Dim rowItm As Object = Nothing
                Dim row = rowItm.r
                Dim d = rowItm.d
                For i = 1 To 2
                    'ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
                    'ret.Rows.Add(x, d, row("数量1"), row("数量2")) : x += 5
                    ret.Rows.Add(x, d, row("数量1"), row("数量2"), row("マーク"))
                Next
            End If
            isFirst2 = False

この書き方ではおかしいのですよね?
Dim row = rowItm.r で 「System.NullReferenceException: 'オブジェクト変数または With ブロック変数が設定されていません。」のエラーが出ます。

 
なお、row("マーク") は "*" または " " になるようにしています。

        With ret.Columns()
            .Add("x", GetType(Integer))
            .Add("時刻", GetType(DateTime))
            .Add("数量1", GetType(Integer))
            .Add("数量2", GetType(Integer))
            .Add("マーク", GetType(String))
        End With

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86520 ] / ▼[ 86526 ]
■86522 / 12階層)  Re[12]: ChartのX軸のタイトル表示
□投稿者/ shu (1094回)-(2018/02/08(Thu) 08:10:01)
No86520 (mako さん) に返信
> ■No86518 (shu さん) に返信
>
>>例えば
>> ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
>> ret.Rows.Add(x, d, row("数量1"), row("数量2")) : x += 5
>>とした場合、どのようになるかわかりますか?
>>その状態と実際に行いたいこととの差が何なのかはっきりさせるとなんとかならないでしょうか?
>
> If Not isFirst2 Then
> Dim rowItm As Object = Nothing
> Dim row = rowItm.r
> Dim d = rowItm.d
> For i = 1 To 2
> 'ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
> 'ret.Rows.Add(x, d, row("数量1"), row("数量2")) : x += 5
> ret.Rows.Add(x, d, row("数量1"), row("数量2"), row("マーク"))
> Next
> End If
> isFirst2 = False
>
> この書き方ではおかしいのですよね?
> Dim row = rowItm.r で 「System.NullReferenceException: 'オブジェクト変数または With ブロック変数が設定されていません。」のエラーが出ます。
>

それはどんな処理になりますか?処理内容を考えてプログラムを行わないと動くわけありません。

私が提示したコードで気になるのが空白部分ということでしたよね?まずは空白いれる処理を外してみて下さい。

各ポイントの追加前に無条件で空白を入れる処理を行ってみて下さい。

空白を入れるタイミングを条件を追加することにより制御してみて下さい。


[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86522 ] / ▼[ 86528 ]
■86526 / 13階層)  Re[13]: ChartのX軸のタイトル表示
□投稿者/ mako (17回)-(2018/02/08(Thu) 16:20:27)
No86522 (shu さん) に返信

今一、分かってなくてすみません。

空白をいれるか否かの処理を、IF文などで row("マーク") の "*" または " " で判断出来ないものかと思ったのですが、
エラーも出てますのでそもそもテストにしても↓のをここに使ったのは間違いだったのかもしれません。

ret.Rows.Add(x, d, row("数量1"), row("数量2")) : x += 5
ret.Rows.Add(x, d, row("数量1"), row("数量2"), row("マーク"))



> ■No86520 (mako さん) に返信
>>■No86518 (shu さん) に返信
>>
> >>例えば
> >> ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
> >> ret.Rows.Add(x, d, row("数量1"), row("数量2")) : x += 5
> >>とした場合、どのようになるかわかりますか?
> >>その状態と実際に行いたいこととの差が何なのかはっきりさせるとなんとかならないでしょうか?
>>
>>            If Not isFirst2 Then
>>                Dim rowItm As Object = Nothing
>>                Dim row = rowItm.r
>>                Dim d = rowItm.d
>>                For i = 1 To 2
>>                    'ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
>>                    'ret.Rows.Add(x, d, row("数量1"), row("数量2")) : x += 5
>>                    ret.Rows.Add(x, d, row("数量1"), row("数量2"), row("マーク"))
>>                Next
>>            End If
>>            isFirst2 = False
>>
>>この書き方ではおかしいのですよね?
>>Dim row = rowItm.r で 「System.NullReferenceException: 'オブジェクト変数または With ブロック変数が設定されていません。」のエラーが出ます。
>>
> 
> それはどんな処理になりますか?処理内容を考えてプログラムを行わないと動くわけありません。
> 
> 私が提示したコードで気になるのが空白部分ということでしたよね?まずは空白いれる処理を外してみて下さい。
> 
> 各ポイントの追加前に無条件で空白を入れる処理を行ってみて下さい。
> 
> 空白を入れるタイミングを条件を追加することにより制御してみて下さい。
> 
> 

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86526 ] / ▼[ 86530 ]
■86528 / 14階層)  Re[14]: ChartのX軸のタイトル表示
□投稿者/ shu (1095回)-(2018/02/08(Thu) 17:23:41)
No86526 (mako さん) に返信

ポイントの追加は
                If disp Then
                    'ret.Rows.Add(d, row("数量1"), row("数量2"))
                    ret.Rows.Add(x, d, row("数量1"), row("数量2"))
                    x += 5
                End If
ここで行っているので
これを他に移動すると動作がおかしくなると思います。
このポイントの追加の前に条件判定で空白を追加すればよい気がします。

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86528 ] / ▼[ 86531 ]
■86530 / 15階層)  Re[15]: ChartのX軸のタイトル表示
□投稿者/ mako (18回)-(2018/02/08(Thu) 23:29:02)
No86528 (shu さん) に返信
      
      '間
            If Not isFirst2 Then
                For i = 1 To 2
                    ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
                Next
            End If
            isFirst2 = False

この部分で 間(空白) を付けてるのですよね?
なので、 IF文で、row("マーク") が  "*" か " " かの 条件判定が出来ないものかと思ったのです。

もちろんそれに合わせてデータでの  '*' マークも付けるものとして。


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
        Dim mark As String        'とりあえずは連続した時間の最初のデータのみに '*' マークを付ける。
    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

        ' 8:10〜8:45           
        For i = 10 To 45        ' 8:10〜8:45
            datS = datS + 1
            Uridat(datS).mark = " "
            'Uridat(datS).Jikoku = "8:" & Str(i)  '時刻
            Uridat(datS).Jikoku = $"8:{i:00}"    '時刻
            Uridat(datS).Suu1 = i * 10           '数量1
            Uridat(datS).Suu2 = i * 5            '数量2 

            Uridat(datS).mark = " "
            If i = 10 Then
                Uridat(datS).mark = "*"          ' とりあえずはデータの最初にのみ "*" マーク を付けてみる。
            End If
        Next

        ' 10:20〜11:55
        For i = 0 To 59        ' 10:20〜10:59
            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
            Uridat(datS).mark = " "

            If i = 0 Then
                Uridat(datS).mark = "*"            '  とりあえずはデータの最初にのみ "*" マーク を付けてみる。
            End If
        Next
        For i = 0 To 55        ' 11:00〜11:55
            datS = datS + 1
            'Uridat(datS).Jikoku = "11:" & Str(i)   '時刻
            Uridat(datS).Jikoku = $"11:{i:00}"     '時刻
            Uridat(datS).Suu1 = i + 100            '数量1
            Uridat(datS).Suu2 = i + 20             '数量2

            Uridat(datS).mark = " "               '  とりあえずはデータの最初ではないので"*" マークは付けないことにする
        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))
            .Add("マーク", GetType(String))
        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
            dtRow(3) = Uridat(i).mark      'マーク

            ds.Tables(0).Rows.Add(dtRow)
        Next

        'Chart に表示するデータソースを設定
        Dim min = -1
        Dim max = -1
        Dim intr = 30
        Dim tbl = GetChartDs(ds, intr, min, max)
        Chart1.DataSource = tbl.Select("", "x")
        Chart1.Series.Clear()
        '
        With Chart1.ChartAreas(0)
            With .AxisX
                .Minimum = min
                .Maximum = max
                .Interval = 5
                For Each row In tbl.Select("", "時刻")
                    Dim null = row.IsNull("数量1")
                    If null Then Continue For
                    Dim d = row.Field(Of Date)("時刻")
                    Dim x = row.Field(Of Integer)("x")
                    With .CustomLabels.Add(x - 2, x + 2, d.ToString("HH:mm"))
                        .RowIndex = 0
                    End With
                Next
            End With
        End With

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

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

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

        With ret.Columns()
            .Add("x", GetType(Integer))
            .Add("時刻", GetType(DateTime))
            .Add("数量1", GetType(Integer))
            .Add("数量2", GetType(Integer))
            .Add("マーク", GetType(String))
        End With

        Dim x = 1
        Min = x
        x = 5

        '一番左にスペース
        'ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5   '特に必要はないようにも。

        Dim isFirst2 = True
        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", "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
                         Order By d
                         Group By h Into rows = Group)
            '間
            If Not isFirst2 Then
                For i = 1 To 2
                    ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
                Next
            End If
            isFirst2 = False

            Dim hour = itm.h
            Dim isFirst = True
            For Each rowItm In itm.rows
                Dim row = rowItm.r
                Dim d = rowItm.d
                Dim disp = False
                If isFirst Then disp = True : isFirst = False
                If Not disp Then
                    If d.Minute Mod IntrMin = 0 Then
                        disp = True
                    End If
                End If

                If disp Then
                    ret.Rows.Add(x, d, row("数量1"), row("数量2"))
                    x += 5
                End If
            Next
        Next
        Max = x
        ret.AcceptChanges()
        Return ret
    End Function
End Class

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86530 ] / ▼[ 86533 ]
■86531 / 16階層)  Re[16]: ChartのX軸のタイトル表示
□投稿者/ shu (1096回)-(2018/02/09(Fri) 00:45:43)
No86530 (mako さん) に返信

> ' 8:10〜8:45
> For i = 10 To 45 ' 8:10〜8:45
> datS = datS + 1
> Uridat(datS).mark = " "
> 'Uridat(datS).Jikoku = "8:" & Str(i) '時刻
> Uridat(datS).Jikoku = $"8:{i:00}" '時刻
> Uridat(datS).Suu1 = i * 10 '数量1
> Uridat(datS).Suu2 = i * 5 '数量2
>
> Uridat(datS).mark = " "
> If i = 10 Then
> Uridat(datS).mark = "*" ' とりあえずはデータの最初にのみ "*" マーク を付けてみる。
> End If
> Next
>
> ' 10:20〜11:55
> For i = 0 To 59 ' 10:20〜10:59
> 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
> Uridat(datS).mark = " "
>
> If i = 0 Then
> Uridat(datS).mark = "*" ' とりあえずはデータの最初にのみ "*" マーク を付けてみる。
> End If
> Next
> For i = 0 To 55 ' 11:00〜11:55
> datS = datS + 1
> 'Uridat(datS).Jikoku = "11:" & Str(i) '時刻
> Uridat(datS).Jikoku = $"11:{i:00}" '時刻
> Uridat(datS).Suu1 = i + 100 '数量1
> Uridat(datS).Suu2 = i + 20 '数量2
>
> Uridat(datS).mark = " " ' とりあえずはデータの最初ではないので"*" マークは付けないことにする
> Next
>


一旦上記のサンプルデータ部について
8:10〜8:45, 10:20〜11:55のデータが1分毎にあって
8:10, 10:20の*マークのところは時間間隔に関わらず
プロットしてそこでは左にスペースを設ける
ということでよろしいでしょうか?

だとした場合時間順にデータをピックアップして表示するデータのみを抽出
*がついていたらその前に空白データを追加となるかと思います。

仮に30分単位のピックアップとして
8:10
8:30
10:20
10:30
11:00
11:30
の順でピックアップ、ただし8:10と10:20は*がついているのでこれらのデータの直前に空白データを追加
となるのでデータが追加される順番をかんがえると
1 空白
2 8:10
3 空白
4 10:20
5 10:30
6 11:00
7 11:30
となります。

プログラム的にはサンプルデータを時間順に抽出するループ内でターゲトとなるか確認しながらピックアップしていき
もしも*がついていたらピックアップデータを追加する前に空白データを追加するという流れになります。
元の
 '間
の場所で空白を追加していたのは1時間の開始データ前で空白を追加するという考えで行っていたものなので上記流れには
合わなくなります。itm.rowsの中の先頭データが*か調べればできなくはないですが先頭データではなく途中に*があった場合でも
その前には空白を入れても構わないと思うのでこの場所での空白追加はやめて、


> If disp Then
> ret.Rows.Add(x, d, row("数量1"), row("数量2"))
> x += 5
> End If
ここの ret.Rows.Add(x, d, row("数量1"), row("数量2"))を行う直前でif判定でrow("Mark")の内容をチェックして
空白を追加すればよいと思うのです。

さらにループも時間毎にグループ化する必要がないのでループのネストが不要になります。

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86531 ] / ▼[ 86534 ]
■86533 / 17階層)  Re[17]: ChartのX軸のタイトル表示
□投稿者/ mako (19回)-(2018/02/09(Fri) 14:47:49)
No86531 (shu さん) に返信

お世話になります。

        ' 10:20〜11:55
        'For i = 0 To 59        ' 10:20〜10:59     ’<--- これは間違い
        For i = 20 To 59        ' 10:20〜10:59
            datS = datS + 1
            Uridat(datS).Jikoku = $"10:{i:00}"     '時刻
            Uridat(datS).Suu1 = i + 100            '数量1
            Uridat(datS).Suu2 = i + 20             '数量2
            Uridat(datS).mark = " "

            'If i = 0 Then                         ’<--- これは間違い
            If i = 20 Then
                    Uridat(datS).mark = "*"            ' "*" マーク
            End If
        Next

先ず最初に↑のような間違いをしてましたので修正をさせていただきます。


> 仮に30分単位のピックアップとして
> 8:10
> 8:30
> 10:20
> 10:30
> 11:00
> 11:30
> の順でピックアップ、ただし8:10と10:20は*がついているのでこれらのデータの直前に空白データを追加
> となるのでデータが追加される順番をかんがえると
> 1 空白      
> 2 8:10
> 3 空白
> 5 10:20
> 6 10:30
> 7 11:00
> 8 11:30
> となります。


 1 空白 
 2 8:10
 3 8:30
 3 空白
 4 10:20
 5 10:30
 6 11:00
 7 11:30
 となりますね。


>>If disp Then
>>   ret.Rows.Add(x, d, row("数量1"), row("数量2"))
>>   x += 5
>>End If
> ここの ret.Rows.Add(x, d, row("数量1"), row("数量2"))を行う直前でif判定でrow("Mark")の内容をチェックして
> 空白を追加すればよいと思うのです。

   If row("マーク") = "*" Then

   End If

そのようには思うのですが今はこれくらいしか思いつきません(汗;


ちなみに、
何故、*マークを付けたかは、その方がプログラムも簡素化かが出来るのでは?? とも思ったからです。

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86533 ] / ▼[ 86538 ] ▼[ 86580 ]
■86534 / 18階層)  Re[18]: ChartのX軸のタイトル表示
□投稿者/ shu (1097回)-(2018/02/09(Fri) 16:02:56)
No86533 (mako さん) に返信

>
> If row("マーク") = "*" Then
>
> End If
>
> そのようには思うのですが今はこれくらいしか思いつきません(汗;
>
row("マーク")はobject型なので文字列化すればその条件でよいと思います。
その間の記述とどこに書くかだけだと思うのですが何故試してみないのでしょうか?
[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86534 ] / 返信無し
■86538 / 19階層)  Re[19]: ChartのX軸のタイトル表示
□投稿者/ mako (20回)-(2018/02/09(Fri) 22:43:47)
2018/02/16(Fri) 16:49:28 編集(投稿者)
2018/02/13(Tue) 15:31:00 編集(投稿者)

この投稿は取り消しにします。

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86534 ] / ▼[ 86586 ]
■86580 / 19階層)  Re[19]: ChartのX軸のタイトル表示
□投稿者/ mako (21回)-(2018/02/16(Fri) 16:46:33)
No86534 (shu さん) に返信

お世話になります。
下記のようなことになりましたので投稿させて頂きます。

> row("マーク")はobject型なので文字列化すればその条件でよいと思います。
取り敢えずその部分は作ってみました。


> さらにループも時間毎にグループ化する必要がないのでループのネストが不要になります。
No86531でのこの部分は結局どうすれば良いのか分かりませんでした。


> dtRow(0) = Uridat(i).Jikoku    '時刻
もしかしてこの時点で先に文字列型から日付型 (Date)に変換しておいた方がプログラムの簡素化には繋がるのでしょうか?


なお、↓のプログラムですと、60分を越える120分(1時間)、240分(2時間)などともなると表示は60分と同じともなってしまいます。

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
        Dim mark As String        '連続した時間の最初のデータのみに '*' マークを付ける。
    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

        ' 8:10〜8:45           
        For i = 10 To 45        ' 8:10〜8:45
            datS = datS + 1

            Uridat(datS).Jikoku = $"8:{i:00}"    '時刻
            Uridat(datS).Suu1 = i * 10           '数量1
            Uridat(datS).Suu2 = i * 5            '数量2 

            Uridat(datS).mark = " "
            If i = 10 Then
                Uridat(datS).mark = ""          ' "*" マーク
            End If
        Next

        ' 10:20〜13:59      <------------ 時間を延長
        For i = 20 To 59        ' 10:20〜10:59
            datS = datS + 1
            Uridat(datS).Jikoku = $"10:{i:00}"     '時刻
            Uridat(datS).Suu1 = i + 100            '数量1
            Uridat(datS).Suu2 = i + 20             '数量2
            Uridat(datS).mark = " "

            Uridat(datS).mark = " "
            If i = 20 Then
                Uridat(datS).mark = "*"            ' "*" マーク
            End If
        Next
        For i = 0 To 59        ' 11:00〜11:59
            datS = datS + 1
            Uridat(datS).Jikoku = $"11:{i:00}"     '時刻
            Uridat(datS).Suu1 = i + 100            '数量1
            Uridat(datS).Suu2 = i + 20             '数量2

            Uridat(datS).mark = " "
        Next
        For i = 0 To 59        ' 12:00〜12:59
            datS = datS + 1
            Uridat(datS).Jikoku = $"12:{i:00}"     '時刻
            Uridat(datS).Suu1 = i + 100            '数量1
            Uridat(datS).Suu2 = i + 20             '数量2

            Uridat(datS).mark = " "
        Next
        For i = 0 To 59        ' 13:00〜13:59
            datS = datS + 1
            Uridat(datS).Jikoku = $"13:{i:00}"     '時刻
            Uridat(datS).Suu1 = i + 100            '数量1
            Uridat(datS).Suu2 = i + 20             '数量2

            Uridat(datS).mark = " "
        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))
            .Add("マーク", GetType(String))
        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
            dtRow(3) = Uridat(i).mark      'マーク

            ds.Tables(0).Rows.Add(dtRow)
        Next

        'Chart に表示するデータソースを設定
        Dim min = -1
        Dim max = -1
        Dim intr = 30  ' 60  120  240
        Dim tbl = GetChartDs(ds, intr, min, max)
        Chart1.DataSource = tbl.Select("", "x")
        Chart1.Series.Clear()
        '
        With Chart1.ChartAreas(0)
            With .AxisX
                .Minimum = min
                .Maximum = max
                .Interval = 5
                For Each row In tbl.Select("", "時刻")
                    Dim null = row.IsNull("数量1")
                    If null Then Continue For
                    Dim d = row.Field(Of Date)("時刻")
                    Dim x = row.Field(Of Integer)("x")
                    With .CustomLabels.Add(x - 2, x + 2, d.ToString("HH:mm"))
                        .RowIndex = 0
                    End With
                Next
            End With
        End With

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

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

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

        With ret.Columns()
            .Add("x", GetType(Integer))
            .Add("時刻", GetType(DateTime))
            .Add("数量1", GetType(Integer))
            .Add("数量2", GetType(Integer))
            .Add("マーク", GetType(String))
        End With

        Dim x = 1
        Min = x
        x = 5

        '一番左にスペース
        'ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5   '特に必要とはしません。

        'Dim isFirst2 = True
        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", "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
                         Order By d
                         Group By h Into rows = Group)
            '間
            'If Not isFirst2 Then
            'For i = 1 To 2
            'ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
            'Next
            'End If
            'isFirst2 = False

            Dim hour = itm.h
            Dim isFirst = True
            For Each rowItm In itm.rows
                Dim row = rowItm.r
                Dim d = rowItm.d
                Dim disp = False
                If isFirst Then disp = True : isFirst = False
                If Not disp Then
                    If d.Minute Mod IntrMin = 0 Then
                        disp = True
                    End If
                End If
                If CType(row("マーク"), String) = "*" Then    'row("マーク")はobject型なので文字列化
                    For i = 1 To 2
                        ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
                    Next

                    If disp Then
                        ret.Rows.Add(x, d, row("数量1"), row("数量2"))
                        x += 5
                    End If
                Else
                    If disp Then
                        ret.Rows.Add(x, d, row("数量1"), row("数量2"))
                        x += 5
                    End If
                End If
            Next
        Next
        Max = x
        ret.AcceptChanges()
        Return ret
    End Function
End Class

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86580 ] / ▼[ 86587 ]
■86586 / 20階層)  Re[20]: ChartのX軸のタイトル表示
□投稿者/ shu (1098回)-(2018/02/18(Sun) 00:14:00)
No86580 (mako さん) に返信
 
>>さらにループも時間毎にグループ化する必要がないのでループのネストが不要になります。
> No86531でのこの部分は結局どうすれば良いのか分かりませんでした。
hでのGroup化をなくせば
For Each rowItm In itm.rows
のループをはずすことが出来ます


>>dtRow(0) = Uridat(i).Jikoku    '時刻
> もしかしてこの時点で先に文字列型から日付型 (Date)に変換しておいた方がプログラムの簡素化には繋がるのでしょうか?
確かにその通りですが、DataTable dtの定義が
.Add("時刻", GetType(String))
となっている部分が実際の実装上不可欠ということであれば変換しても文字列になるので無意味です。
.Add("時刻", GetType(Date))
と出来るのであればいみがあります。


> 
> なお、↓のプログラムですと、60分を越える120分(1時間)、240分(2時間)などともなると表示は60分と同じともなってしまいます。
> 
>                     If d.Minute Mod IntrMin = 0 Then
この条件が0分を起点として割ったあまりが0という条件なのでそうなります。
そういうことであれば起点とする時間からの総分数に対し条件判定を行う必要があります。


ループの部分の改良版は以下となります。
*マークの付くデータが最初に現れないと正常に動作しません。
        Dim tmFirst As Date = Nothing
        For Each rowItm 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", "HH: mm", "H:m"}, Nothing, Nothing, d2) Then
                                            Return d2
                                        Else
                                            Return CDate(Nothing)
                                        End If
                                    End Function(r.Field(Of String)("時刻"))
                            Order By d)

            Dim row = rowItm.r
            Dim d = rowItm.d
            Dim isMark = CType(row("マーク"), String) = "*"
            Dim disp = isMark
            If isMark Then
                tmFirst = d.AddMinutes(-tmFirst.Minute)
            Else
                If CInt(d.Subtract(tmFirst).TotalMinutes) Mod IntrMin = 0 Then
                    disp = True
                End If
            End If
            If disp Then
                If CType(row("マーク"), String) = "*" Then
                    For i = 1 To 2
                        ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
                    Next
                End If
                ret.Rows.Add(x, d, row("数量1"), row("数量2"))
                x += 5
            End If
        Next

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86586 ] / 返信無し
■86587 / 21階層)  Re[21]: ChartのX軸のタイトル表示
□投稿者/ mako (24回)-(2018/02/18(Sun) 14:33:27)
No86586 (shu さん) に返信

お世話になります。

教えて頂いたようにしたとは思うのですが・・、

今回は棒グラフの棒もタイトルの表示のあるとこにしか立たなくなりました。

それと、例えばDim intr = 30 での場合の表示はタイトルと棒グラフの棒ともに
08:30 空白 空白 10:20 10:50 11:20 11:50 12:20 12:50 13:20 12:50 となり、
当初ように 8:10 8:30 空白 空白 10:20 10:30 11:00 11:30 12:00 12:30 13:00 13:30 とはなりませんでした。

また、同じく Dim intr = 60 での場合はタイトルと棒グラフの棒ともに
空白 空白 10:20 11:20 12:20 13:20 となり
8:10 空白 空白 10:20 11:00 12:00 13:00 とはなりませんでした。

タイトルの表示時間は時計での区切りの良い時間です。
15分ですと00分 15分 30分 45分 00分・・、 30分ですと 00分 30分 00分・・ のようにです。

[ 親 86333 / □ Tree ] 返信 編集キー/

▲[ 86471 ] / 返信無し
■86476 / 3階層)  Re[3]: ChartのX軸のタイトル表示
□投稿者/ mako (11回)-(2018/02/01(Thu) 23:29:41)
2018/02/02(Fri) 08:01:57 編集(投稿者)
すみません。
間違えて送信してしまったようです。
削除します。

[ 親 86333 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -