2016-07-05 33 views
0

現在、チャートを主成分とするツールを開発する必要があります。チャートコントロールも私にとっては新しいものです。私は多くの読書をして、チャートコントロールの全体像を学び理解するために研究しています。ここでC#各積み上げ縦棒グラフに水平線を描く

This is the requirement for my project

私はそうやっていること:イメージは下図のように

は、すべての後、私は立ち往生していたと積み上げ縦棒グラフ上の水平線(青&赤の水平線)を描画する方法についての質問はるか:

My charting tool project

これは、これまでの私のコードです:

  // X-Axis labels settings 
     chart.ChartAreas[0].AxisX.LabelStyle.Angle = -45; 
     chart.ChartAreas[0].AxisX.Interval = 1; 

     // Y-Axis labels settings 
     //chart.ChartAreas[0].AxisY.Minimum = 100; 
     chart.ChartAreas[0].AxisY.Minimum = 95; 

     // Plotting chart 
     using (YieldEntities context = new YieldEntities()) 
     { 

      // Extract yield loss list 
      var yeilds = (
       from yeild in context.YeildDatas 
       group yeild by new { yeild.Loss } into newyeild 
       select new 
       { 
        Loss = newyeild.Key.Loss, 
        Percentage = newyeild.Sum(p => p.Percentage) 
       }).OrderByDescending(p => p.Percentage); 

      //context.YeildDatas.Select(p => new { p.Loss, Percentage = p }).Distinct(); 

      // Create new series 
      foreach (var yield in yeilds) 
      { 
       chart.Series.Add(yield.Loss); 
       chart.Series[yield.Loss].ChartType = SeriesChartType.StackedColumn100; 
      } 

      // Label settings for first series 
      chart.Series[0].SmartLabelStyle.Enabled = false; 
      chart.Series[0].LabelAngle = -90; 
      chart.Series[0].Font = new Font(Font.FontFamily, 15, FontStyle.Bold); 
      chart.Series[0].IsValueShownAsLabel = true; 

      var query = context.YeildDatas.ToList(); 
      foreach (var item in query) 
      { 
       DataPoint dp = new DataPoint(); 
       dp.SetValueXY(item.DateString, item.Percentage); 
       chart.Series[item.Loss].Points.Add(dp); 
      } 

      // Set empty datapoint for each series 
      foreach (var yield in yeilds) 
      { 
       DataPoint nulldp = new DataPoint(); 
       nulldp.SetValueXY("", 0); 
       chart.Series[yield.Loss].Points.Insert(1, nulldp); 
       chart.Series[yield.Loss].Points.Insert(6, nulldp); 
       chart.Series[yield.Loss].Points.Insert(11, nulldp); 
      } 

      chart.Legends["Legend"].IsEquallySpacedItems = true; 
      chart.Legends["Legend"].IsTextAutoFit = true; 

     } 

私はこの問題を解決するために私を導く専門家を得たいと思っています。これが唯一のサンプルです

+0

、あなたは自分でチャートコントロールを描画していますか?または、完成したチャートコントロールを使用していますか?フィニッシュチャートコントロールを使用している場合は、チャートコントロールでイベントペイントを使用し、そこにDrawLineを試してみてください。 –

+0

Visual Studio 2015で提供されているチャートコントロールを使用しています。 –

+0

あなたの質問は基本的に一連の要件です。表示するコードは? – MickyD

答えて

0

、あなたはそこから起動することができます。

// Data point to pixel 
var pixelX = this.chart1.ChartAreas[0].AxisX.ValueToPixelPosition(dataPointX); 
var pixelY = this.chart1.ChartAreas[0].AxisY.ValueToPixelPosition(dataPointY); 

// Pixel to data point 
var dataPointX = this.chart1.ChartAreas[0].AxisX.PixelPositionToValue(pixelX); 
var dataPointY = this.chart1.ChartAreas[0].AxisY.PixelPositionToValue(pixelY); 

// Use event Paint to draw your line 
private void chart1_Paint(object sender, PaintEventArgs e) 
{ 
    // Convert dataPoint to pixel 
    var dataPointX = this.chart1.Series[0].Points[0].XValue; 
    var dataPointY = this.chart1.Series[0].Points[0].YValues[0]; 

    var pixelX = this.chart1.ChartAreas[0].AxisX.ValueToPixelPosition(dataPointX); 
    var pixelY = this.chart1.ChartAreas[0].AxisY.ValueToPixelPosition(dataPointY); 

    // Only sample, pen should be initialized outside Paint method 
    Pen pen = new Pen(Brushes.Red); 

    // Example of drawing line with width=100 pixel 
    e.Graphics.DrawLine(pen, pixelX, pixelY, pixelX + 100, pixelY); 
} 
+0

ありがとうございましたx ...それは働いています! –

+0

あなたは大歓迎です...楽しんでください:=) –

+0

x ... 1番目と2番目のデータポイントの幅を取得する方法はありますか?私は '100'を行の幅として置き換えて返します。 –

関連する問題