2016-08-10 48 views
0

我目前正在研究創建圖表以顯示數據的模塊。我使用System.Windows.Forms.DataVisualization.Charting.Chart如何在指向某些數據的圖表中添加箭頭

我有兩條帶狀線顯示我們得到的平均結果和另一個顯示我們想要的結果。

到目前爲止,我對我所擁有的東西非常滿意,但我想添加明確的箭頭指向這些行。我無法弄清楚如何去做。

我看到Line Annotation可能有幫助,但我找不到想要的方法。

這裏是我想要做什麼的例子:

enter image description here

+0

你的意思你想要將箭頭添加到兩條彩色線條,還是希望將兩條黑色箭頭線條與文本相加? – TaW

+0

兩個黑色箭頭線與文本。 – drov

回答

0

你必須使用

  • 批註或
  • GDI +繪製的選擇

在這兩種情況下,挑戰是獲得職位沒錯。

更自然的方式去使用Annotations,所以讓我們來看看這首:

有多種類型,但不同的能力;文字可以通過RectangleAnnotationTextAnnotation顯示。線條和箭頭只能由LineAnnotations顯示。所以我們需要一對Line - 加上TextAnnotation爲你的兩條線。

像許多其他圖表元素註釋位於百分比其各自的容器;這有時使事情變得棘手。

要將線條註釋全部放在圖表的右側,您可以將其X屬性設置爲100;讓它進入左邊,將寬度設置爲負數。問題在此之後開始..

要找出ChartArea的右邊緣在哪裏,您需要編碼Pre- or PostPaint事件並使用ToRectangleF方法。

要找出y值,您需要從數據值;爲此,可以使用AxisY.ValueToPixelPosition方法轉換爲像素,從中可以使用圖表的ClientArea以及ChartArea百分比大小來計算百分比。

複雜嗎?對。 Annotations得到很多簡單的使用,如果你可以他們到一定DataPoint;但你的是在ChartArea之外..

這裏是一個函數進行計算時,應該幫助:

double PercentFromValue(Chart chart, ChartArea ca, double value) 
{ 
    Axis ay = ca.AxisY; 
    RectangleF car = ca.Position.ToRectangleF(); 
    double py = ay.ValueToPixelPosition(value); 
    int caHeight = (int)(chart.ClientRectangle.Height * car.Height/100f); 
    return 100d * py/caHeight; 
} 

注意,從所謂的Pre/PostPaint事件時,它只會可靠工作..

所以這是一個例子一個PrePaint事件定位一個LineAnnotation lAnn

private void chart1_PrePaint(object sender, ChartPaintEventArgs e) 
{ 
    Rectangle cr = chart1.ClientRectangle; 
    ChartArea ca = chart1.ChartAreas[0]; 
    RectangleF car = ca.Position.ToRectangleF(); 

    lAnn.Width = car.Width - lAnn.X; 
    lAnn.Y = PercentFromValue(chart1, ca, someDataValue); 
} 

當你插入一個有效數據點y值的ST arting y-position將被設置。您可以使用它,直到找到設置四個位置屬性的完美組合。

當創建並添加四個(!)註釋時,您可能希望保留類級別引用,所以您不必引用他們從註釋集合..

對於LineAnnotation你將要設置線寬,顏色和capstyle,無論是使用EndCapStartCap

lAnn.EndCap = LineAnchorCapStyle.Arrow;


GDI +繪圖更直接,只要您知道要在哪裏繪製線條和文本。

它還在預製事件後,再次使用ValueToPixelPosition找到兩條數據線的pixelposition ..除此之外都是平常的東西用Graphics.DrawLine,具有PenStart- or EndCapGraphics.DrawString也許TextRenderer.DrawText。 。

我坦率地不知道我會選擇哪種方式..

0

創建三角形圖像,並設置標記圖像爲:

Chart1.Series.Points.AddXY(0, 10); 
Chart1.Series.Points.AddXY(20,10); 
Chart1.Series[0].Points[1].MarkerImage = "TriangleImage.bmp"; 
Chart1.Series[0].Points[1].MarkerImageTransparentColor = Color.White; 

or 
Chart1.Series[0].Points[1].MarkerStyle = MarkerStyle.Triangle;