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

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

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

ChartのX軸のタイトル表示 [1]

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

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

引用返信 編集キー/
■86477 / inTopicNo.22)  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, チャートの右端と左端の空白(棒グラフの無い部分)は無くならないでしょうか?

引用返信 編集キー/
■86478 / inTopicNo.23)  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さんが回答されていないことだと
思います。
引用返信 編集キー/
■86481 / inTopicNo.24)  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

引用返信 編集キー/
■86484 / inTopicNo.25)  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

引用返信 編集キー/
■86485 / inTopicNo.26)  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さんのやりたいことすべてにお答えすることはこちらが開発することと同じになってしまいます。
ここで得られた情報をもとに自分なりのコーディングをされるとよいと思います。

引用返信 編集キー/
■86499 / inTopicNo.27)  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

引用返信 編集キー/
■86500 / inTopicNo.28)  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
この部分なのでその条件のときに実ポイントを追加する前に空白ポイントを追加すればよいです。



引用返信 編集キー/
■86516 / inTopicNo.29)  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
> この部分なのでその条件のときに実ポイントを追加する前に空白ポイントを追加すればよいです。
>

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





引用返信 編集キー/
■86518 / inTopicNo.30)  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
とした場合、どのようになるかわかりますか?
その状態と実際に行いたいこととの差が何なのかはっきりさせるとなんとかならないでしょうか?
引用返信 編集キー/
■86520 / inTopicNo.31)  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

引用返信 編集キー/
■86522 / inTopicNo.32)  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 ブロック変数が設定されていません。」のエラーが出ます。
>

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

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

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

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


引用返信 編集キー/
■86526 / inTopicNo.33)  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 ブロック変数が設定されていません。」のエラーが出ます。
>>
> 
> それはどんな処理になりますか?処理内容を考えてプログラムを行わないと動くわけありません。
> 
> 私が提示したコードで気になるのが空白部分ということでしたよね?まずは空白いれる処理を外してみて下さい。
> 
> 各ポイントの追加前に無条件で空白を入れる処理を行ってみて下さい。
> 
> 空白を入れるタイミングを条件を追加することにより制御してみて下さい。
> 
> 

引用返信 編集キー/
■86528 / inTopicNo.34)  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
ここで行っているので
これを他に移動すると動作がおかしくなると思います。
このポイントの追加の前に条件判定で空白を追加すればよい気がします。

引用返信 編集キー/
■86530 / inTopicNo.35)  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

引用返信 編集キー/
■86531 / inTopicNo.36)  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")の内容をチェックして
空白を追加すればよいと思うのです。

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

引用返信 編集キー/
■86533 / inTopicNo.37)  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

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


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

引用返信 編集キー/
■86534 / inTopicNo.38)  Re[18]: ChartのX軸のタイトル表示
□投稿者/ shu (1097回)-(2018/02/09(Fri) 16:02:56)
No86533 (mako さん) に返信

>
> If row("マーク") = "*" Then
>
> End If
>
> そのようには思うのですが今はこれくらいしか思いつきません(汗;
>
row("マーク")はobject型なので文字列化すればその条件でよいと思います。
その間の記述とどこに書くかだけだと思うのですが何故試してみないのでしょうか?
引用返信 編集キー/
■86538 / inTopicNo.39)  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 編集(投稿者)

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

引用返信 編集キー/
■86580 / inTopicNo.40)  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

引用返信 編集キー/

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

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

管理者用

- Child Tree -