タイトル | : Re^2: (△解決)Chartオブジェクトで任意の場所にラベルオブジェクトを移動 |
記事No | : 11660 |
投稿日 | : 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
|