2015-10-08 3 views
0

Я работаю над окном, которое генерирует тепловую карту точек данных. Я использую список настраиваемых структур, называемых «Pipes», которые содержат свои собственные списки точек данных. Я тогда перебрать мой список списков, как показано здесь:Перечень списков для управления диаграммой

foreach (NewPipe pipe in wall) 
{ 
    foreach (DataPoint x in pipe.returnPoints(xNum)) 
    { 
     chart1.Series["Series1"].Points.Add(x); 
    } 
    xNum++; 
} 

Хотя это работает, это кажется ужасно неэффективным. Также было бы неплохо, если бы я мог просто обновить список списков и обновить график, вместо того, чтобы очистить его и перерисовать (или вручную удалить удаленные данные и т. Д.). Я знаком с структурой BindingList, это правильный инструмент для использования, и если да, то как вы привязываете список в списке к диаграмме? (Так как я действительно после данных, хранящихся в списке в списке нижнего уровня). Может быть, я полностью использую неправильные структуры? (Хотя списки списков фактически соответствуют тому, как данные генерируются достаточно хорошо).

+0

Какой тип диаграммы вы используете? Это поможет лучше понять проблему, чтобы увидеть, как выглядит результат. – TaW

+0

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

+0

Вы решили свои проблемы? – TaW

ответ

2

Предполагая, что вы хотите создать Heatmap, который выглядит примерно мои примеры here или here я боюсь, что с помощью Chart управления для этой цели не может быть лучшим выбором.

Хотя это не невозможно использовать Charttype Point, чтобы создать его, он будет иметь несколько проблем ..

  • Наиболее примечательным является тот факт, что вам придется создавать отдельные DataPoints для каждой точки в карте ,

  • Это довольно дорого

  • Они не будут изменять размеры с графиком. Вы можете установить их размер, установив Series.MarkerSize на подходящее количество пикселей, но при изменении размера вам придется адаптироваться. далее
  • Одно ограничение в том, что маркеры все квадраты, так что это будет трудно создать беспрерывное диаграмму ..

Вы спросили о DataBinding сделать все это более эффективным.

Вы используете списки списка DataPoints но:

  • DataBinding только связывает значения диаграммы, не готовые DataPoints
  • Даже списки значений имеют свои limitations:

При использовании нестандартных источников данных, таких как списки или массивы, вы можете связывать только значения Y, независимо от типа метода привязки данных б/у. Это связано с тем, что столбцы не могут быть указаны для значений X и других свойств диаграммы, например Tooltip.

Это не может быть большой проблемой, если ваши X-значения не важны.

Ну, есть many ways использовать DataBinding с Chart, как на Chart и на Series уровнях.

И еще один Points.DataBind перегрузки, что looks как если было бы целесообразно, чтобы связать цвета, как это поддерживает расширенные свойства:

Points.DataBind

же, как и выше, плюс:

Поддерживает привязку для расширенных свойств диаграммы, таких как всплывающие подсказки.

Таким образом, связывание с DataView

DataTable DT = new DataTable("data"); 

DT.Columns.Add("xField", typeof(int)); 
DT.Columns.Add("yFields", typeof(int)); 
DT.Columns.Add("tipp", typeof(string)); 
DT.Columns.Add("kolor", typeof(Color)); 

DataRow row = DT.NewRow(); 
row["xField"] = 1; row["yFields"] = 1; row["tipp"] = "red"; row["kolor"] = Color.Red; 
DT.Rows.Add(row); // ...etc... 

DataView DV = new DataView(DT); 
chart1.DataSource = DV; 

должен работать так:

someSeries.Points.DataBind(DV, "xField", "yFields", 
          "MarkerColor=kolor,Color=kolor,Tooltip=tipp,Label=tipp"); 

Однако, в то время как Labels и ToolTips действительно получить связаны, то DataPoint.Color не:

enter image description here

Это неутешительно; ведь DataPoint.Color - это атрибут bindable. Но это игнорируется.

Here список поддерживаемых свойств:

Список этих свойств являются следующим: AxisLabel, подсказка, этикетки, LegendText, LegendTooltip и CustomPropertyName (имя пользовательского свойства).

Заключение: AFAIK DataBinding будет не позволяют установить цветныеDataPoints. Чтобы сделать ваш код более эффективным с помощью элемента управления Chart, вы можете просто попробовать использовать chart1.SuspendLayout и chart1.ResumeLayout, чтобы сделать установку в одном.

Однако я бы вместо этого рассмотрел возможность использования элемента управления Chart в первую очередь.

Ссылки на двух примерах, которые я дал в первом абзаце показаны два альтернативных способа:

  • Первый все о рисования Heatmap в GDI +. Это действительно тривиально и очень эффективно. (Детали в сообщении не связаны с вашей проблемой ..) Для простого масштабирования я предлагаю рисовать в Bitmap, который вы назначаете Panel или PictureBox; создайте его в ClientSize и установите Panel.ImageLayout (или PictureBox.SizeMode) как Stretch.

  • Второй пример использует CellsDataGridView как большие «пиксели» для тепловой карты ...

Просмотреть вторую ссылку для способа создания приятного List<Color>!

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