2016-05-04 97 views
3

我已將註釋與數據點對齊;我想垂直對齊註釋。圖表註釋:我如何對齊沿着數據軸的註釋

我讀過這個,但不知道如何將圖表寬度與數據點關聯。 https://msdn.microsoft.com/en-us/library/dd456731.aspx

這:MS Charting Annotations refuse to align to mouse position

我添加了圖表的圖象到目前爲止,例如,

'create new chart 
chart1 = New DataVisualization.Charting.Chart 

'add chart areas 
    chart1.ChartAreas.Add("NewChartArea") 
    chart1.ChartAreas("NewChartArea").Area3DStyle.Enable3D = False 
    chart1.ChartAreas("NewChartArea").AxisX.MajorGrid.Enabled = False 'turn chart background grid on and off 
    chart1.ChartAreas("NewChartArea").AxisY.MajorGrid.Enabled = False 'turn chart background grid on and off 
    chart1.ChartAreas("NewChartArea").AxisX.Title = "Activities of daily living" '----> title on the bottom for the x axis 
    '[template] chart1.ChartAreas("NewChartArea").AxisX.LabelStyle.Angle = 45 
    '[template] Chart1.Series(SeriesZeroChartName).Label = " my own label" ' -----> adds a label at the top of each bar 

    For c As Integer = 2 To Me.DataGridViewResultsAdls.ColumnCount - 1 

     Dim NextSeriesChartName As String 
     NextSeriesChartName = DataGridViewResultsAdls.Columns(c).Name 

     chart1.Series.Add(NextSeriesChartName) 
     chart1.Series(NextSeriesChartName).ChartType = DataVisualization.Charting.SeriesChartType.Bar 'CHART CHANGER ****** change this value to change chart type 
     chart1.Series(NextSeriesChartName).Points.Clear() 
     chart1.Series(NextSeriesChartName).IsValueShownAsLabel = True '----> puts little labels ontop of each bar 
     chart1.Series(NextSeriesChartName).SmartLabelStyle.Enabled = True 


     ' fill each subsequent series with points 
     For Count As Integer = 0 To DataGridViewResultsAdls.Rows.Count - 2 
       Dim NextColumnName As String 
       NextColumnName = DataGridViewResultsAdls.Columns(c).Name 

       ' define X values 
       Dim XLabelMyCustom As String 
       XLabelMyCustom = DataGridViewResultsAdls.Item(0, Count).Value 
       'define Y values 
       Dim YLabelMyCustom As String 
       YLabelMyCustom = DataGridViewResultsAdls.Item(NextColumnName, Count).Value 

       ' add the point to the chart 
       chart1.Series(NextSeriesChartName).Points.AddXY(XLabelMyCustom, YLabelMyCustom) 

       ' create custom labels for the x axis 
       chart1.ChartAreas("NewChartArea").AxisX.CustomLabels.Add(Count + 0.5, Count + 0.4 + 0.5, "Q2", 0, DataVisualization.Charting.LabelMarkStyle.None) 
       chart1.ChartAreas("NewChartArea").AxisX.CustomLabels.Add(Count + 0.5 + 0.5, Count + 0.9 + 0.5, "Q1", 0, DataVisualization.Charting.LabelMarkStyle.None) 
       chart1.ChartAreas("NewChartArea").AxisX.CustomLabels.Add(Count + 0.5, Count + 1, "Q3", 2, DataVisualization.Charting.LabelMarkStyle.LineSideMark) 



       'Create a variable MyDataPoint to hold the current datapoint 
       Dim MyDataPoint As DataPoint 
       MyDataPoint = chart1.Series(NextSeriesChartName).Points(Count) 
       'Create a new text annotation 
       Dim MyTextAnnotation As TextAnnotation 
       MyTextAnnotation = New TextAnnotation 
       MyTextAnnotation.Text = "some notation" 
       '[template] MyTextAnnotation.X = <---- sets coordinates on screen for x 
       '[template ]MyTextAnnotation.Y = <---- sets coordinates on screen for y 
       '[template] MyTextAnnotation.AnchorDataPoint = MyDataPoint 'sets the point where the notation will be 
       '[template] chart1.Annotations.Add(MyTextAnnotation) ' adds the notation to the chart 

       ' only add annotations to the chart once per series 
       If c = 2 Then 
        MyTextAnnotation.AxisY = chart1.ChartAreas("NewChartArea").AxisY 

        ' [template] chart1.Series(NextSeriesChartName).Points.Item(Count).ToString <--- output points to a string {x,y} 


        MyTextAnnotation.AnchorDataPoint = MyDataPoint 'sets the point where the notation will be 
        chart1.Annotations.Add(MyTextAnnotation) ' adds the notation to the chart 
        MyTextAnnotation.AnchorOffsetX = -10 


       End If 
      Next 

     Next 

     'Add chart to control and set dock to fill 
     Me.PanelChartAdls.Controls.Add(chart1) 
     chart1.Dock = DockStyle.Fill 

    End If 
+0

你可以在你的截圖中繪製你想要的位置嗎? (Nice [Red Circles](http://meta.stackexchange.com/questions/19478/the-many-memes-of-meta),btw ..) - 你可能需要一些[Offset](https:// msdn .microsoft.com/en-us/library/system.windows.forms.datavisualization.charting.annotation.anchoroffsety%28v = vs.110%29.aspx) – TaW

+0

:)我做了,我想要註釋的位置是在黃色突出顯示:) 我嘗試使用偏移集,但我不確定如何準確計算它,因爲數據點使用圖表高度和寬度的%代表 –

+0

此圖表上的x軸也是垂直的,因爲它是一個條形圖,所以繪圖點的X軸與圖表的高度有關 - 我認爲 –

回答

2

定位在Chart控制是相當複雜的。

要與圖表開始有座標系:

  • 的數據值
  • 百分比一些地區,最引人注目的是ChartAreaChart控制的ClientArea
  • InnerPlotPosition
  • 像素

最簡單的方法來實現你e Annotations的定位是第一錨各爲其DataPoint

MyTextAnnotation.AnchorDataPoint = MyDataPoint 

接下來您覆蓋X位置,以你喜歡的值:

MyTextAnnotation.X = someValue; 

的幾個注意事項:

  • 雖然通過默認Annotation.Position將使用percentages,之後錨定它到數據點它使用值代替。因此,使用50不會某處放置在圍在了中間,但所有的權利...

在你的圖看,我建議使用的3值。

  • 如果你的數值有所不同,這個定位也會有所不同。而當您調整Chart的大小時,Axes將被調整大小,Annotations也會移動。

順便說一句:的百分比是相對於下一個外容器:該ChartAreasChart.ClientRectangle,將InnerPlotPostionChartArea和每個元素到它停靠在容器..

  • Positions默認設置爲自動,所以它們的值是NaN。要訪問(當前)值,您可以撥打ElementPosition.ToRectangleF()

  • 另請注意,Chart's Axes上有幾個函數可以轉換值,像素和百分比位置。

但是你需要找到一個有效的時刻調用這些函數;如果Chart沒有完成其佈局,他們將返回null

您可以安全地在三個Paint事件之一中調用它們,或者響應像鼠標事件這樣的用戶交互。

下面是如何使用它們用於定位所有Annotations到(有點)固定的像素位置:

private void chart1_PostPaint(object sender, ChartPaintEventArgs e) 
{ 
    Axis AY = chart1.ChartAreas[0].AxisY; 

    double pypx = AY.ValueToPosition(AY.PixelPositionToValue(30)); 

    foreach (TextAnnotation ta in chart1.Annotations) 
    { 
     ta.X = pypx; 
    } 
} 

現在,當圖表被調整大小的Annotations不會移動或當數據值增長或收縮。至少不是很多;可以看到幾個跳躍。要麼是因爲我錯過了某些事情,要麼是因爲四捨五入問題。

但是我不建議用在你軸線的X檔設定爲固定值的簡單的方法去..:

MyTextAnnotation.X = 3; 

這將使他們在你畫的黃線。

+0

!非常感謝 !這個答案在很多層面上都很棒。我真的很感激所花費的時間。 –

+0

您能否推薦資源,以便我可以詳細瞭解上面的圖表過程? –

+0

沒有超出MSDN的範圍,因爲Chart控件沒有很好的記錄,而我所知道的是通過搜索高低來學習的。你可能想通過幾個[我SO帖子](http://stackoverflow.com/search?tab=newest&q=user%3a3152130%20ChartArea),雖然處理這些問題..(最近他們是,當我寫他們的時候我就知道的越多;-) – TaW