2015-05-05 2 views
1

Я создал программу, которая читает в текстовом файле и отображает данные из этого файла в DataGridView; Затем я использую данные из этого DGV для обновления «диаграммы» на основе результатов, диаграмма состоит только из линейных графиков.MsChart Выберите часть данных и обновите диаграмму

То, что я пытаюсь сделать, позволяет пользователю выбирать часть этих данных, перетаскивая начало и конец на нее, как если бы вы увеличивали масштаб, если была включена только ось x, и обновить график на основе на этот выбор, вычисляя средние значения для этого подмножества данных.

Использование

chart1.ChartAreas["ChartArea1"].CursorX.IsUserEnabled = Enabled; 
chart1.ChartAreas["ChartArea1"].CursorX.IsUserSelectionEnabled = Enabled; 

Это позволяет мне выбрать область и увеличить, но я не уверен в том, как на самом деле обновления данных на основе выбора, а не просто увеличение.

+0

Звучит как дубликат [this] (http://stackoverflow.com/questions/29985796/chart-zoom-in-to-show-more-precise-data/29986941#29986941) - когда вы увеличиваете масштаб, автоматически обновляете его. Что, если вы этого хотите? Что вы хотите со средними значениями, которые вы упоминаете? – TaW

+0

Он собирает средние значения, повторяя количество строк, которые составляют граф, например, если есть 3000 строк, он будет работать от 0 до 3000 и делить на 3000, однако просто масштабирование не является для обновления оси X max и минимума она просто покажет увеличенное изображение. Если он был выбран от половины до конца, так что min = 1500 и max = 3000, то, очевидно, это было бы что-то вроде (i = min, i

+0

Я все еще не совсем уверен: Является ли пропуская часть диаграммы или вы показываете ее где-то в другом месте? и: Когда масштаб увеличен, вы хотите, чтобы среднее значение рассчитывалось только из видимых точек? – TaW

ответ

1

Чтобы хорошо масштабирование, вы должны добавить эту строку в двух вы показываете:

chart1.ChartAreas["ChartArea1"].AxisX.ScaleView.Zoomable = true; 

Вот функция для вычисления в среднем 1-го, Y. Видимая точек:

private void chart1_AxisViewChanged(object sender, ViewEventArgs e) 
{ 
    // for a test the result is shown in the Form's title 
    Text = "AVG:" + GetAverage(chart1, chart1.Series[0], e); 
} 

double GetAverage(Chart chart, Series series, ViewEventArgs e) 
{ 
    ChartArea CA = e.ChartArea; // short.. 
    Series S = series;   // references 

    DataPoint pt0 = S.Points.Select(x => x) 
          .Where(x => x.XValue >= CA.AxisX.ScaleView.ViewMinimum) 
          .DefaultIfEmpty(S.Points.First()).First(); 
    DataPoint pt1 = S.Points.Select(x => x) 
          .Where(x => x.XValue <= CA.AxisX.ScaleView.ViewMaximum) 
          .DefaultIfEmpty(S.Points.Last()).Last(); 
    double sum = 0; 
    for (int i = S.Points.IndexOf(pt0); i < S.Points.IndexOf(pt1); i++) 
     sum += S.Points[i].YValues[0]; 

    return sum/(S.Points.IndexOf(pt1) - S.Points.IndexOf(pt0) + 1); 
} 

Примечания что параметр ViewEventArgs предоставляет значения положения и размера представления, но это только XValues данных, а не их индексы; поэтому нам нужно искать Points слева для первого и справа для последней точки.

Update Иногда зумирование работает в особые проблемы: Когда данные более мелкозернистый, чем по умолчанию CursorX.IntervalType он просто не позволит вам увеличить. В таком случае вам просто нужно адаптироваться к масштабам ваших данных, например. например: CA.CursorX.IntervalType = DateTimeIntervalType.Milliseconds;

+0

Я реализовал это и ничего не обновлял в заголовке формы, теперь я использую всплывающую подсказку, которая отображает средние значения при подсвечивании строки и имеет пять серий, которые это делают. Можно ли получить здесь обновленную версию? –

+0

_nothing обновлено в заголовке формы_ Вы подключили событие AxisViewChanged? – TaW

+0

_ Теперь я использую всплывающую подсказку, которая отображает средние значения при подсвечивании строки. Пожалуйста, объясните, что означают эти две вещи! Что вы подразумеваете под подсветкой? перетаскивая диаграмму с помощью мыши? Отображается ли ваша подсказка? – TaW

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