tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルChartオブジェクトで任意の場所にラベルオブジェクトを移動
記事No11658
投稿日: 2016/04/26(Tue) 16:33
投稿者食う寝る走る
開発環境
 OS:Windows7(32bit)プロフェッショナル
 IDE:VS2015 コミュニティ(VB.net)


Chartオブジェクトで、散布図を描画しました。
コメントとしてラベルを使いたいと考えております。「Chartオブジェクト内で任意の場所にラベルオブジェクトを移動」させたいのですが、お知恵を拝借したく思います。

Pictureboxオブジェクトで散布図を作成して行う方法はできますが、ChartオブジェクトでLabel1をプロットした緑の点に移動させるには?

可否は?ですが、考え方として2つ浮かびますが、何か良い方法ないでしょうか。


(1)Labelコントロールの親コントロールをピクチャーコントロールとして移動できないか?

(2)Chartオブジェクト上のポイントを、スクリーン座標にしてからスクリーン座標でLabelを移動する?例題として、マウスカーソルやオブジェクトの位置取得はググると見つかるのですが、ChartコントロールのChartAreas内の座標からのものは・・・。


下記コードは、フォームに、
Chart
Picturebox
Button
Label×2個
貼り付けて実行してください。

’----------------------------------------------------------------------------------------
Imports System.Windows.Forms.DataVisualization.Charting

Public Class Form1

    Dim series1 As New Series() 'SIN
    Dim series2 As New Series() '任意
    Dim xval() As Double 'X軸格納
    Dim yval() As Double 'Y1軸格納

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

        Label1.BackColor = Color.Red
        Label2.BackColor = Color.Red

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

        '~データのシリーズ追記
        Chart1.Series.Add(series1) 'SIN
        Chart1.Series.Add(series2)


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


        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


        '凡例
        Chart1.Series(0).LegendText = "sin(X)"



        ' グラフの種類は散布図(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.Primary

            .Enabled = True
        End With


        ' グラフの種類は散布図(任意Point Chart)
        With series2
            .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

        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軸値格納

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

            k = k + 1
        Next

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'Labelコントロールの親コントロールをチャートコントロールとする
        Label1.Parent = Chart1
        'Labelコントロールの親コントロールをピクチャーコントロールとする
        Label2.Parent = PictureBox1

        series2.Points.Clear()  '内部データの初期化
        series2.Points.AddXY(8, 1) '打点

        Me.Label1.Location = New Point(8, 1)

        Dim objBrush = New SolidBrush(System.Drawing.Color.Blue)
        Dim objGrp As Graphics = PictureBox1.CreateGraphics

        ' 楕円を描く
        objGrp.FillEllipse(objBrush, 500, 50, 20, 20)

        Label2.Location = New Point(500, 50)

        ' リソースを解放する
        objBrush.Dispose()
        objGrp.Dispose()

    End Sub

End Class

’----------------------------------------------------------------------------------------

[ツリー表示へ]
タイトルRe: Chartオブジェクトで任意の場所にラベルオブジェクトを移動
記事No11659
投稿日: 2016/04/28(Thu) 07:45
投稿者shu
ChartのPaintイベントかPostPaintイベント辺りで
描画するのはどうでしょう?

Labelの役割が何なのかにもよりますが。

[ツリー表示へ]
タイトルRe^2: (△解決)Chartオブジェクトで任意の場所にラベルオブジェクトを移動
記事No11660
投稿日: 2016/04/28(Thu) 15:06
投稿者食う寝る走る
shu さま
レスありがとうございます。

> Labelの役割が何なのかにもよりますが。
複数のライン、カーブ(要素)を引くので、コメント(名前、X値、Y値、備考)を付けたいのが理由です。色分けして、Chartの外にラベル書きしていましたが、プロットした要素の近くにコメントをもっていきたいのが理由ですね。ToolTipはマウスが当たっている時しかでないし・・・。

> ChartのPaintイベントかPostPaintイベント辺りで描画するのはどうでしょう?
これは、Chart座標内のプロット座標をスクリーン座標かフォームのクライアント座標変換が必要ですよね?
先ほどまで、
プロットしたseries2.Points.AddXY(8, 1)をChartのクライアント座標へ変換を試みていましたが断念。
チャート内の(8,1)を変換するとChartオブジェクトの左上の空白部分を指します。
なんとかChartエリア内を取得してもChartスケールはその都度変わるので・・・難と判断。

Chartオブジェクトで完結できるそのような機能が無いか調べておりました。
下記に近そうなものを見つけました。

チャートの注釈(CalloutAnnotation)
http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=262&no=14


修正したコードを載せておきます。
注釈(CalloutAnnotation)のプロパティを見ると任意のChart座標指定で配置することは出来そうです。
ただし、引き出し線だらけになるので線を無くしたいところですが・・・。
もう少し、CalloutAnnotationを設定してみて、妥協するかもしれません。
現在「△解決」としておきます。
妥協するか、引き出し線が消すことが出来れば、「解決」としたいと思います。



'--------------------------------------------------------------------------------------
Imports System.Windows.Forms.DataVisualization.Charting

Public Class Form1

    Dim series1 As New Series() 'SIN
    Dim series2 As New Series() '任意
    Dim xval() As Double 'X軸格納
    Dim yval() As Double 'Y1軸格納

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

        Label1.BackColor = Color.Red
        Label2.BackColor = Color.Red

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

        '~データのシリーズ追記
        Chart1.Series.Add(series1) 'SIN
        Chart1.Series.Add(series2)


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


        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


        '凡例
        Chart1.Series(0).LegendText = "sin(X)"



        ' グラフの種類は散布図(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.Primary

            .Enabled = True
        End With


        ' グラフの種類は散布図(任意Point Chart)
        With series2
            .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

        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軸値格納

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

            k = k + 1
        Next

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'Labelコントロールの親コントロールをチャートコントロールとする
        Label1.Parent = Chart1
        'Labelコントロールの親コントロールをピクチャーコントロールとする
        Label2.Parent = PictureBox1

        series2.Points.Clear()  '内部データの初期化
        series2.Points.AddXY(8, 1) '打点

        Me.Label1.Location = New Point(8, 1)

        Dim objBrush = New SolidBrush(System.Drawing.Color.Blue)
        Dim objGrp As Graphics = PictureBox1.CreateGraphics

        ' 楕円を描く
        objGrp.FillEllipse(objBrush, 500, 50, 20, 20)

        Label2.Location = New Point(500, 50)

        ' リソースを解放する
        objBrush.Dispose()
        objGrp.Dispose()


        '■------------------- 注釈を設定 ----------------Start--■
        Dim ca As New CalloutAnnotation()
        ca.Name = "CA1"
        ca.CalloutStyle = CalloutStyle.Borderline '他7種類の形があります
        ca.Text = "Label"             '注釈の文字
        ca.ForeColor = Color.Black
        ca.Font = New Font("MS P明朝", 8, FontStyle.Bold)
        ca.BackColor = Color.Red
        ca.ShadowColor = Color.Blue
        ca.ShadowOffset = 3
        ca.AllowAnchorMoving = True
        ca.AllowMoving = True
        ca.AllowPathEditing = True

        '表示位置の設定
        ca.AnchorDataPoint = Chart1.Series(1).Points(0)
        Chart1.Annotations.Add(ca)
        '■-----------------------------------------------End----■

    End Sub
End Class

[ツリー表示へ]
タイトルRe^3: (解決)Chartオブジェクトで任意の場所にラベルオブジェクトを移動
記事No11661
投稿日: 2016/05/06(Fri) 10:10
投稿者食う寝る走る
Dim ca As New CalloutAnnotation()
を 
Dim ca As New TextAnnotation()
とすると、線が消えた注釈となります。
しかし、BackColorの設定はスルーされるので、文字だけとなってしまいます。
他、設定方法ありそうですが、BackColorが無いと見にくくなるので、No.11660の引き出し線有りで妥協と致します。



     '■------------------- 注釈を設定 ----------------Start--■
        'Dim ca As New CalloutAnnotation()
        Dim ca As New TextAnnotation()


        ca.Name = "CA1"
        'ca.CalloutStyle = CalloutStyle.Borderline '他7種類の形があります
        ca.Text = "Label"             '注釈の文字
        ca.ForeColor = Color.Black
        ca.Font = New Font("MS P明朝", 8, FontStyle.Bold)
        ca.BackColor = Color.Red
        ca.ShadowColor = Color.Blue
        ca.ShadowOffset = 3
        ca.AllowAnchorMoving = True
        ca.AllowMoving = True
        ca.AllowPathEditing = True

        '表示位置の設定
        ca.AnchorDataPoint = Chart1.Series(1).Points(0)
        Chart1.Annotations.Add(ca)
        '■-----------------------------------------------End----■

[ツリー表示へ]