tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルChartオブジェクト 打点でのX軸の扱いに関して
記事No11647
投稿日: 2016/04/07(Thu) 18:40
投稿者食う寝る走る
開発環境
 OS:Windows7(32bit)プロフェッショナル
 IDE:VS2015 コミュニティ(VB.net)

前回はNo.11641で Chartコントロールで、カーソルの表示に関して質問させて頂きました。
今回は、同じような考えで、既にフォームのLOADイベントで表示してあるチャート上の指定ポイント(X-Y)に打点をしたいのですが、
何故か X軸の値にどのような値を入れてもX=0に打点され、X軸目盛が消えてしまいます。


サンプルコードでは、SIN(Y1軸)、COS(Y2軸)波を書いてあります。

(質問1)X=5、Y=0に打点する場合、Y軸は反映されますがX軸は0の所に打点されてしまう?

(質問2)打点後、X軸の軸目盛が消えてしまう?

以上となりますが、よろしくお願いいたします。



下記コードは、フォーム上に
Chart×1
ボタン×1
テキストボックス×2
ラベル×2
貼り付けの上、実行しボタン1のクリックでテキストボックス1(X軸),2(Y軸)の値をチャートにに打点いたします。


'------------------------------------------------------------------------------------------------
Imports System.Windows.Forms.DataVisualization.Charting
Public Class Form1

    Dim series1 As New Series() 'SIN
    Dim series2 As New Series() 'COS
    Dim series3 As New Series() '任意ポイント プロット
    Dim series4 As New Series() '任意ポイント プロット
    Dim xval() As Double 'X軸格納
    Dim yval() As Double 'Y1軸格納
    Dim yval2() As Double 'Y2軸格納

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load


        Label1.Text = "X"
        Label2.Text = "Y"
        TextBox1.Text = 5
        TextBox2.Text = 0

        'チャートコントロールオブジェクト
        Chart1.Series.Clear()

        '~データのシリーズ追記
        With Chart1
            .Series.Add(series1) 'SIN
            .Series.Add(series2) 'COS
            .Series.Add(series3) '任意ポイント プロット
            .Series.Add(series4) '任意ポイント プロット
        End With



        '内部データの初期化
        series1.Points.Clear()
        series2.Points.Clear()
        series3.Points.Clear()
        series4.Points.Clear()


        ' グラフの種類は散布図(Point Chart)
        series1.ChartType = SeriesChartType.Point

        With Chart1.ChartAreas(0).AxisX
            '10点毎に補助線を表示
            .MinorGrid.Enabled = True  'True に設定しないと表示しない
            .Title = "X"
            .MinorGrid.Interval = 100
            .MinorGrid.LineDashStyle = DataVisualization.Charting.ChartDashStyle.Dash
            .LabelStyle.Format = "0.0"
        End With


        With Chart1.ChartAreas(0).AxisY 'Y軸の設定
            .TitleForeColor = Color.Red
            .Title = "sin(X)"  'タイトルのテキストを設定
            .LineColor = Color.Red
            .MajorGrid.LineColor = Color.Red
            .LabelStyle.ForeColor = Color.Red
            .MajorGrid.LineDashStyle = DataVisualization.Charting.ChartDashStyle.Solid
            .LabelStyle.Format = "0.0"
            .Enabled = AxisEnabled.True '第1軸を有効化
        End With

        '

        With Chart1.ChartAreas(0).AxisY2 'Y2軸の設定
            .TitleForeColor = Color.Blue
            .Title = "cos(X)"  'タイトルのテキストを設定
            .LineColor = Color.Blue
            .MajorGrid.LineColor = Color.Blue
            .LabelStyle.ForeColor = Color.Blue
            .MajorGrid.LineDashStyle = DataVisualization.Charting.ChartDashStyle.Solid
            .LabelStyle.Format = "0.0"
            .Enabled = AxisEnabled.True '第二軸表示を有効化

        End With


        '凡例
        With Chart1
            .Series(0).LegendText = "cos(X)"
            .Series(1).LegendText = "sin(X)"
            .Series(2).LegendText = "プロット"
            .Series(3).LegendText = "プロット"
        End With



        ' グラフの種類は散布図(sin Chart)
        With series1
            .ChartType = SeriesChartType.Point
            .MarkerSize = 5
            .MarkerStyle = MarkerStyle.Circle
            .MarkerBorderColor = Color.Black
            .MarkerBorderWidth = 0.1
            .MarkerColor = Color.Blue
            .XAxisType = AxisType.Primary
            .YAxisType = AxisType.Secondary
            .Enabled = True
        End With



        ' グラフの種類は散布図(cos Chart)
        With series2
            .ChartType = SeriesChartType.Point
            .MarkerSize = 5
            .MarkerStyle = MarkerStyle.Circle
            .MarkerBorderColor = Color.Black
            .MarkerBorderWidth = 0.1
            .MarkerColor = Color.Red
            .XAxisType = AxisType.Primary
            .YAxisType = AxisType.Primary
            .Enabled = True
        End With



        ' グラフの種類は散布図(任意Point Chart)
        With series3
            .ChartType = SeriesChartType.Point
            .MarkerSize = 20
            .MarkerStyle = MarkerStyle.Circle
            .MarkerBorderColor = Color.Black
            .MarkerBorderWidth = 0.1
            .MarkerColor = Color.Green
            .XAxisType = AxisType.Primary
            .YAxisType = AxisType.Primary
            .Enabled = True
        End With

        ' グラフの種類は散布図(任意Point Chart)
        With series4
            .ChartType = SeriesChartType.Point
            .MarkerSize = 20
            .MarkerStyle = MarkerStyle.Circle
            .MarkerBorderColor = Color.Black
            .MarkerBorderWidth = 0.1
            .MarkerColor = Color.Aquamarine
            .XAxisType = AxisType.Primary
            .YAxisType = AxisType.Secondary
            .Enabled = True
        End With


        Dim k As Integer = 0 '格納配列のアドレス用カウンター
        For i = 0 To 10 Step 0.01
            ReDim Preserve xval(k) '配列の要素数の変更
            xval(k) = i 'X軸値格納
            ReDim Preserve yval(k) '配列の要素数の変更
            yval(k) = Math.Sin(xval(k)) 'Y軸値格納
            ReDim Preserve yval2(k) '配列の要素数の変更
            yval2(k) = Math.Cos(xval(k)) 'Y2軸値格納

            series1.Points.AddXY(xval(k), yval(k)) 'SIN波プロット
            series2.Points.AddXY(xval(k), yval2(k)) 'COS波プロット

            k = k + 1
        Next

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        series3.Points.Clear()  '内部データの初期化
        series3.Points.AddXY(TextBox1.Text, TextBox2.Text) '打点

        series4.Points.Clear() '内部データの初期化
        series4.Points.AddXY(TextBox1.Text, TextBox2.Text) '打点

    End Sub
End Class

[ツリー表示へ]
タイトルRe: Chartオブジェクト 打点でのX軸の扱いに関して
記事No11648
投稿日: 2016/04/08(Fri) 10:56
投稿者まりもん
実験してみました。

>     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
>
>         series3.Points.Clear()  '内部データの初期化
>         series3.Points.AddXY(TextBox1.Text, TextBox2.Text) '打点
>
>         series4.Points.Clear() '内部データの初期化
>         series4.Points.AddXY(TextBox1.Text, TextBox2.Text) '打点
>
>     End Sub
> End Class

ここの部分ですが、AddXYの引数として、String型を渡していて
Public Function AddXY ( xValue As Object, ParamArray yValue As Object()) As Integer
として解釈されたのではないかと思います。
それで、Xの値の中に"5"(文字の5)がないので自動でスケール変更されてしまったのではないかと
思います。

series3.Points.AddXY(CDbl(TextBox1.Text), CDbl(TextBox2.Text))
とすれば、
Public Function AddXY ( xValue As Double, yValue As Double) As Integer
が確実に呼ばれるので、希望の動作になるかと

[ツリー表示へ]
タイトルRe^2: Chartオブジェクト 打点でのX軸の扱いに関して(解決+追記ご質問)
記事No11649
投稿日: 2016/04/11(Mon) 13:36
投稿者食う寝る走る
>まりもん さま
例題コードを実験してご回答していただきありがとうございます。
データ型を ご指摘のようにCDblで変換したら、うまくいきました。

X軸はグラフで折れ線、バーグラフ等で文字列を扱う事が出来るので散布図(X-Y:数字-数字)の場合は数字に明示化しておかないと(文字として)娯解釈されてしまうようですね。

作成中のコードに登場する問題なく動く「.Points.AddXY(CDbl、CDbl)」ステートメント部も全てCdblで修正いたしました。 数日間デバッグで悩んでいましたが、おかげさまで 次へ進めそうです。


デバッグの際の質問になりますが、
VB6のころは、10進数表示だったと思うのですが、
 デバッグでステートメント単位でステップで変数内に入っているデータを見ると、String型はそのまま"文字"表示されるのですが、k=k+1のような加算カウンターのDouble、Integer型(数字)ではkの値が「&H0000001C」のような16進数表示されるのですがデバッグで10進数表示に出来ないでしょうか?



> 実験してみました。
>
> >     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
> >
> >         series3.Points.Clear()  '内部データの初期化
> >         series3.Points.AddXY(TextBox1.Text, TextBox2.Text) '打点
> >
> >         series4.Points.Clear() '内部データの初期化
> >         series4.Points.AddXY(TextBox1.Text, TextBox2.Text) '打点
> >
> >     End Sub
> > End Class
>
> ここの部分ですが、AddXYの引数として、String型を渡していて
> Public Function AddXY ( xValue As Object, ParamArray yValue As Object()) As Integer
> として解釈されたのではないかと思います。
> それで、Xの値の中に"5"(文字の5)がないので自動でスケール変更されてしまったのではないかと
> 思います。
>
> series3.Points.AddXY(CDbl(TextBox1.Text), CDbl(TextBox2.Text))
> とすれば、
> Public Function AddXY ( xValue As Double, yValue As Double) As Integer
> が確実に呼ばれるので、希望の動作になるかと

[ツリー表示へ]
タイトルRe^3: Chartオブジェクト 打点でのX軸の扱いに関して(解決+追記ご質問)
記事No11650
投稿日: 2016/04/11(Mon) 16:00
投稿者まりもん
> デバッグの際の質問になりますが、
> VB6のころは、10進数表示だったと思うのですが、
>  デバッグでステートメント単位でステップで変数内に入っているデータを見ると、String型はそのまま"文字"表示されるのですが、k=k+1のような加算カウンターのDouble、Integer型(数字)ではkの値が「&H0000001C」のような16進数表示されるのですがデバッグで10進数表示に出来ないでしょうか?

ウォッチウインドウでのことであれば、右クリックメニューの中に「16進数で表示」という項目があり
そこにチェックが付いてないでしょうか?
もし付いているのであれば、外してください。

ただ、現在手元にVisualStudio2013Expressしかない為、表示等異なるかもしれません。

[ツリー表示へ]
タイトルRe^4: Chartオブジェクト 打点でのX軸の扱いに関して(解決+追記ご質問)
記事No11651
投稿日: 2016/04/13(Wed) 13:38
投稿者食う寝る走る
>まりもん さま

ご質問の仕方があやふやですみません。

コードを記述する所で、
例えば
k=k+1のステートメントに"ブレークポイント"を作成すると、
プログラム実行時にここで止まると思います(ステートメントが黄色になる)が、
この時、kの所にカーソルを当てると変数内のデータが表示されますがこの時の表示が、
「&H0000001C」のような16進数表示になっております。

ブレークポイントの変数を10進法表示に出来ないかと思っております。


2015では、ウォッチウインドウは無いようで、代わりに
Console.WriteLine(k)
と記述することで「出力」ウィンドウにkの内容が出力されます。
出力結果は10進数です。



> ウォッチウインドウでのことであれば、右クリックメニューの中に「16進数で表示」という項目があり
> そこにチェックが付いてないでしょうか?
> もし付いているのであれば、外してください。
>
> ただ、現在手元にVisualStudio2013Expressしかない為、表示等異なるかもしれません。

[ツリー表示へ]
タイトルRe^5: Chartオブジェクト 打点でのX軸の扱いに関して(解決+追記ご質問)
記事No11652
投稿日: 2016/04/13(Wed) 15:58
投稿者まりもん

> コードを記述する所で、
> 例えば
> k=k+1のステートメントに"ブレークポイント"を作成すると、
> プログラム実行時にここで止まると思います(ステートメントが黄色になる)が、
> この時、kの所にカーソルを当てると変数内のデータが表示されますがこの時の表示が、
> 「&H0000001C」のような16進数表示になっております。
>
> ブレークポイントの変数を10進法表示に出来ないかと思っております。
>
>
> 2015では、ウォッチウインドウは無いようで、代わりに
> Console.WriteLine(k)
> と記述することで「出力」ウィンドウにkの内容が出力されます。
> 出力結果は10進数です。
>
>

マウスオーバーで表示される値の部分を右クリックしてもメニューが表示され、
16進数で表示の項目がありましたので、それで変更できると思います。

右クリック時のメニュー表示です。
http://hanatyan.sakura.ne.jp/yybbs/upl/1460530568-1.png


また、2015にもウォッチウインドウはあります。
メニューの「デバッグ」→「ウインドウ」にウォッチウインドウ関連がありますし
実行時にブレイクポイントで止めた時に変数を右クリック→「ウォッチ式の追加」などで
表示することもできます。

[ツリー表示へ]
タイトルRe^6: Chartオブジェクト 打点でのX軸の扱いに関して(解決)
記事No11653
投稿日: 2016/04/13(Wed) 17:11
投稿者食う寝る走る
ご回答ありがとうございます。

> マウスオーバーで表示される値の部分を右クリックしてもメニューが表示され、
> 16進数で表示の項目がありましたので、それで変更できると思います。
>
> 右クリック時のメニュー表示です。
> http://hanatyan.sakura.ne.jp/yybbs/upl/1460530568-1.png
写真のように「16進数で表示」にチェックが入っていたので外したら解決いたしました。



> また、2015にもウォッチウインドウはあります。
> メニューの「デバッグ」→「ウインドウ」にウォッチウインドウ関連がありますし
> 実行時にブレイクポイントで止めた時に変数を右クリック→「ウォッチ式の追加」などで
> 表示することもできます。
申し訳ありません。VB6の時 Debug.Printで表示されるイミディエイトウィンドウが.Netになって無くなっていたので、イミディエイトウィンドウとの間違いでした。
 ご丁寧に教えていただき、ありがとうございました。

[ツリー表示へ]