Визуальная ошибка при вводе слишком больших чисел в линейный график приложения Windows Form - PullRequest
2 голосов
/ 04 августа 2020

Я использую C#, чтобы попытаться ввести числа в линейный график из текстового файла. Числа в текстовом файле большие, например -30000. Каждый раз, когда я ввожу большое число в график, я получаю визуальный сбой, который окрашивает график в черный цвет. Я что-то делаю не так или это ошибка?

Изображение графика при вводе больших чисел

void ChartLoad()
{
    var chart = LineGraph.ChartAreas[0];

    chart.AxisX.IntervalType = 
    System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Number;

    chart.AxisX.LabelStyle.Format = "";
    chart.AxisY.LabelStyle.Format = "";
    chart.AxisX.LabelStyle.IsEndLabelVisible = true;

    chart.AxisX.Interval = 0.5;
    chart.AxisY.Interval = 10;

    LineGraph.Series[0].IsVisibleInLegend = false;

    LineGraph.Series.Add("Line1");
    LineGraph.Series["Line1"].ChartType = 
    System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
    LineGraph.Series["Line1"].Color = Color.Green;

    LineGraph.Series.Add("Line2");
    LineGraph.Series["Line2"].ChartType = 
    System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
    LineGraph.Series["Line2"].Color = Color.Blue;

    LineGraph.Series["Line1"].Points.AddXY(30000, 30000);
    LineGraph.Series["Line1"].Points.AddXY(-30000, -30000);
}

1 Ответ

2 голосов
/ 04 августа 2020

Проблема в сетке. У вас удивительно небольшой интервал по сравнению с диапазоном ваших ценностей. Сетка настолько плотная, что покрывает ваш график узким ковром из линий сетки.

Вы можете решить это,

  1. переключением сетки:

     chart.AxisX.MinorGrid.Enabled = false;
     chart.AxisX.MajorGrid.Enabled = false;
     chart.AxisY.MajorGrid.Enabled = false;
     chart.AxisY.MinorGrid.Enabled = false;
    
  2. Или путем регулировки интервалов осей до разумного числа в зависимости от диапазона ваших значений. Вы сразу же увидите разницу, если установите интервал:

     chart.AxisX.Interval = 10000;
     chart.AxisY.Interval = 10000;
    

Вот метод, который может сделать это за вас:

private void AddValuesAndAdjustInterval(string series, double xValue, double yValue)
{
    LineGraph.Series[series].Points.AddXY(xValue, yValue);

    var chart = LineGraph.ChartAreas[0];

    double maxValueX = LineGraph.Series[series].Points.Select(x=> x.XValue).Max();
    double minValueX = LineGraph.Series[series].Points.Select(x=> x.XValue).Min();
    double maxValueY = LineGraph.Series[series].Points.SelectMany(x=> x.YValues).Max();
    double minValueY = LineGraph.Series[series].Points.SelectMany(x => x.YValues).Min();
    
    int stepSize = 20; // the smaller this value the larger the grid separation

    chart.AxisX.Interval = (maxValueX - minValueX) / stepSize;
    chart.AxisY.Interval = (maxValueY - minValueY) / stepSize;
}

Теперь вы можно использовать его для добавления значений:

AddValuesAndAdjustInterval("Line1", 30000, 30000);
AddValuesAndAdjustInterval("Line1", -30000, -30000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...