tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルChartのX軸の日付や時刻の表示を任意に指定。
記事No11710
投稿日: 2016/08/08(Mon) 16:56
投稿者toshi
お世話になります。
Win7,VB2010で必要なものだけを自作しる素人です。

今はChartのX軸に自動で日付や時刻を設定し表示をしてるのですが、これを指定した日付や時刻のみ表示をしたいのです。
例えば、日付ですと「6/1、10、20、7/1、10、20、…」などと言った具合に。

よろしくお願いします。

[ツリー表示へ]
タイトルRe: ChartのX軸の日付や時刻の表示を任意に指定。
記事No11711
投稿日: 2016/08/09(Tue) 05:05
投稿者shu
カスタムラベルを使うと出来ます。
位置調整が少し難しいです。

    Private _tbl As DataTable
    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        _tbl = New DataTable()
        With _tbl.Columns
            .Add("x", GetType(Date))
            .Add("y", GetType(Integer))
        End With

        Dim rnd As New Random()
        For Each dy In Enumerable.Range(1, 31)
            _tbl.Rows.Add(#8/1/2016#.AddDays(dy - 1), rnd.Next(0, 20))
        Next

        Chart1.DataSource = _tbl

        With Chart1.Series(0)
            .ChartType = DataVisualization.Charting.SeriesChartType.Line
            .XAxisType = AxisType.Primary
            .XValueType = ChartValueType.Date
            .XValueMember = "x"
            .YValueMembers = "y"
            .IsXValueIndexed = True
        End With

        Dim labelWidth = 2  '--- ラベル幅の半分程度
        With Chart1.ChartAreas(0).AxisX
            With .CustomLabels.Add(1 - labelWidth, 1 + labelWidth, "8/1")
                .GridTicks = GridTickTypes.All
            End With
            With .CustomLabels.Add(10 - labelWidth, 10 + labelWidth, "8/10")
                .GridTicks = GridTickTypes.All
            End With
            With .CustomLabels.Add(20 - labelWidth, 20 + labelWidth, "8/20")
                .GridTicks = GridTickTypes.All
            End With
            .LabelStyle.Font = New Font("MS P明朝", 10)
            .MajorGrid.Enabled = True
            .LabelStyle.TruncatedLabels = False
            .LabelAutoFitStyle = LabelAutoFitStyles.DecreaseFont Or LabelAutoFitStyles.IncreaseFont
            .LabelAutoFitMaxFontSize = 20
            .LabelAutoFitMinFontSize = 5
            .LabelStyle.Interval = 1
        End With

    End Sub

[ツリー表示へ]
タイトルRe^2: ChartのX軸の日付や時刻の表示を任意に指定。
記事No11714
投稿日: 2016/08/10(Wed) 16:44
投稿者toshi
有り難うございます。

'AxisType' は宣言されていません。アクセスできない保護レベルになっています。などのエラーが出ましたので
.XAxisType = DataVisualization.Charting.AxisType.Primary などとして作動はするようにはなったのですが、
実際のデータはもっと多く 8月のみではなく、6〜8月だったりもしますので、
出来れば表示がされたチャートの日付に対して 1、10、20などと指定をしその該当がするとだけを表示をする。
そのようにはならないでしょうか?
またX軸の日付に対してスクロールも掛けています。

[ツリー表示へ]
タイトルRe^3: ChartのX軸の日付や時刻の表示を任意に指定。
記事No11717
投稿日: 2016/08/11(Thu) 13:19
投稿者shu
れたチャートの日付に対して 1、10、20などと指定をしその該当がするとだけを表示をする。
> そのようにはならないでしょうか?
> またX軸の日付に対してスクロールも掛けています。

toshiさんの問題をすべて解決する回答を書いているわけではないので
ヒントとして拡張して考えてみてください。
x軸に自由にラベル表示出来ることがわかっていただければあとは
どのインデックスに対し表示すべきなのかを計算すればよいので
もう少し頑張って結果を載せてもらえればどこを直すとよいか回答が
つきやすいと思います。

[ツリー表示へ]
タイトルRe^4: ChartのX軸の日付や時刻の表示を任意に指定。
記事No11718
投稿日: 2016/08/11(Thu) 22:57
投稿者toshi
有り難うございます。

正直、仕組みが全く分かってませんが、もし可能であれば、
For i = CInt(Chart1.ChartAreas(0).AxisX.Minimum) To CInt(Chart1.ChartAreas(0).AxisX.Maximum)

Next
の中で、If文などで1、10、20など指定した日が該当したときのみ表示をするようにはならないものかと思っています。

[ツリー表示へ]
タイトルRe^5: ChartのX軸の日付や時刻の表示を任意に指定。
記事No11719
投稿日: 2016/08/12(Fri) 07:48
投稿者shu
先のコードを一部変更して
ループで設定するようにすると出来るかもしれません。


        Dim day0 = #7/31/2016#

        Dim rnd As New Random()
        For Each dy In Enumerable.Range(1, 100)
            _tbl.Rows.Add(day0.AddDays(dy), rnd.Next(0, 20))
        Next

・・・
・・・

        With Chart1.ChartAreas(0).AxisX
            Dim dylbl = day0.AddDays(1)
            Dim EndDy = day0.AddDays(100)
            Do While dylbl <= EndDy
                For Each dy In {1, 10, 20}
                    Dim dy2 = dylbl.AddDays(dy - 1)
                    Dim idx = dy2.Subtract(day0).Days
                    With .CustomLabels.Add(idx - labelWidth, idx + labelWidth, dy2.ToString("M/d"))
                        .GridTicks = GridTickTypes.All
                    End With
                Next
                dylbl = dylbl.AddMonths(1)
            Loop

[ツリー表示へ]
タイトルRe^6: ChartのX軸の日付や時刻の表示を任意に指定。
記事No11720
投稿日: 2016/08/12(Fri) 16:20
投稿者toshi
有り難うございます。 

動作確認しましたが、
・日付をDateではなく、"07/31" などとStringで扱いたいです。
・Dim day0 = #7/15/2016# などとすると 1、10、20 にはなりませんでした。
 日付でスクロールもしてますのでそれに合わせ Minimum、Maximum値ともに変更となります。

頓珍漢なこと言ってると思いますがよろしくお願いします。

    Private _tbl As DataTable

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        _tbl = New DataTable()
        With _tbl.Columns
            .Add("x", GetType(String))
            .Add("y", GetType(Integer))
        End With

        Dim day0 = #7/15/2016#    ' #7/31/2016#

        Dim rnd As New Random()
        For Each dy In Enumerable.Range(1, 100)
            _tbl.Rows.Add(day0.AddDays(dy), rnd.Next(0, 20))
        Next
        Chart1.DataSource = _tbl

        With Chart1.Series(0)
            .ChartType = DataVisualization.Charting.SeriesChartType.Line
            .XAxisType = DataVisualization.Charting.AxisType.Primary
            .XValueType = DataVisualization.Charting.ChartValueType.Date
            .XValueMember = "x"
            .YValueMembers = "y"
            .IsXValueIndexed = True
        End With

        Dim labelWidth = 3  '--- ラベル幅の半分程度
        With Chart1.ChartAreas(0).AxisX
            Dim dylbl = day0.AddDays(1)
            Dim EndDy = day0.AddDays(100)
            Do While dylbl <= EndDy
                For Each dy In {1, 10, 20}
                    Dim dy2 = dylbl.AddDays(dy - 1)
                    Dim idx = dy2.Subtract(day0).Days
                    With .CustomLabels.Add(idx - labelWidth, idx + labelWidth, dy2.ToString("M/d"))
                        .GridTicks = DataVisualization.Charting.GridTickTypes.All
                    End With
                Next
                dylbl = dylbl.AddMonths(1)
            Loop
        End With
    End Sub

[ツリー表示へ]
タイトルRe^7: ChartのX軸の日付や時刻の表示を任意に指定。
記事No11721
投稿日: 2016/08/15(Mon) 00:52
投稿者shu
> 有り難うございます。 
>
> 動作確認しましたが、
> ・日付をDateではなく、"07/31" などとStringで扱いたいです。
どこの部分についてでしょうか?データ上は扱わない方がよいと思います。
日付では順番が1日の違いを1で表すことができますがStringでは1日の違いを表す事が出来なく
なってしまうのでラベルの表示からかけ離れてしまいます。


> ・Dim day0 = #7/15/2016# などとすると 1、10、20 にはなりませんでした。
>  日付でスクロールもしてますのでそれに合わせ Minimum、Maximum値ともに変更となります。
>
7/15を0として数えたら1は7/16, 10は7/25, 20は8/4になるのでそのままこちらの提示したサンプルを
使っても表示が合わないのは当然かと思います。
7/15を0とした場合、7/1はいくつになるか考えてみてください。

[ツリー表示へ]
タイトルRe^8: ChartのX軸の日付や時刻の表示を任意に指定。
記事No11722
投稿日: 2016/08/15(Mon) 14:58
投稿者toshi
有り難うございます。

> 日付では順番が1日の違いを1で表すことができますがStringでは1日の違いを表す事が出来なく
> なってしまうのでラベルの表示からかけ離れてしまいます。

どのような意味なのかは分かっていませんが、データが文字列のため
Dim day0 = #7/31/2016# を含め "2016/07/31" などとしたいところはあります。

> 7/15を0とした場合、7/1はいくつになるか考えてみてください。

分かりました。考えてみます。

[ツリー表示へ]
タイトルRe^9: ChartのX軸の日付や時刻の表示を任意に指定。
記事No11724
投稿日: 2016/08/19(Fri) 13:23
投稿者toshi
もし可能であればですが…、
現在ある日付データに、例えば表示したい日付のみに "*" マークを付けるなどし、"*2016/08/01"として、他のデータと同様にセッティング。
表示時に選別表示する、などと言ったことは出来ないでしょうか?
突飛な発想だとは思うのですがよろしくお願いします。

[ツリー表示へ]