2016-07-05 3 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

ты рисуешь свой контроль графиков по себе? Или вы используете законченный контроль диаграммы? Если вы используете финишную диаграмму, попробуйте использовать событие Paint на элементе управления диаграммой и попробуйте DrawLine там –

+0

Я использую предоставленный контроль диаграммы в Visual Studio 2015. Как нарисовать линию sir? –

+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

Спасибо, х ... Он работает! –

+0

Добро пожаловать ... Удачи с ним ...: =) –

+0

x ... как, если я хочу получить ширину между первой и второй точками данных? Результат возврата я буду использовать для замены «100» в качестве ширины линии. –

Смежные вопросы