Как создать и построить ContourSeries с помощью Oxyplot?

У меня есть приложение WPF, в котором мне нужно визуализировать y = y(x1, x2), где x1, x2 — линейные координаты. Я могу сделать это с помощью HeatMapSeries в Oxyplot, но когда я хочу отобразить два набора данных в одном окне, тепловые карты не являются подходящим инструментом. Лучше бы пару контурных серий. Теперь я попытался добиться этого тем же способом, что и с HeatMapSeries, и это сработало очень хорошо:

public void PlotHeatMap (){

   OxyPlot.PlotModel model = new PlotModel { Title = "2-D data" };
   model.Axes.Add( new OxyPlot.Axes.LinearColorAxis { 
   Position = OxyPlot.Axes.AxisPosition.Right, 
   Palette = OxyPalettes.Jet( 500 ), 
   HighColor = OxyColors.Gray, 
   LowColor = OxyColors.Black } );

   OxyPlot.Series.HeatMapSeries heatmap = new OxyPlot.Series.HeatMapSeries {
     Data = ( Double[ , ] )data,
     X0 = x1min,
     X1 = x1max,
     Y0 = x2min,
     Y1 = x2max
    };

   model.Series.Add( heatmap );
}

Вывод из серии HeatMapSeries

Теперь, когда я пытаюсь вместо этого использовать ContourSeries, я просто заменяю HeatMapSeries на ContourSeries:

public void PlotContour (){

   OxyPlot.PlotModel model = new PlotModel { Title = "2-D data" };
   model.Axes.Add( new OxyPlot.Axes.LinearColorAxis { 
   Position = OxyPlot.Axes.AxisPosition.Right, 
   Palette = OxyPalettes.Jet( 500 ), 
   HighColor = OxyColors.Gray, 
   LowColor = OxyColors.Black } );

   OxyPlot.Series.ContourSeries contour = new OxyPlot.Series.ContourSeries {
      ColumnCoordinates = arrayFromMinToMax1,
      RowCoordinates = arrayFromMinToMax2,
      ContourLevels = arrayOfLevels,
      ContourColors = arrayOfColors, // Same # elements as the levels' array
      Data = ( Double[ , ] )data
    };

   model.Series.Add( contour );
}

Это просто производит вывод:

Вывод попытки ContourSeries

Оси x и y есть и соответствуют минимальным и максимальным координатам, но я не вижу контурных линий. Подозреваю, что с настройкой Оси чего-то не хватает (должно быть так же, как и для HeatMapSeries??). Я не знаю, как поступить с этим контурным графиком. Есть ли примеры, кроме, например, ContourSeriesExamples на GitHub?

Спасибо за любую помощь!


person Mats Isaksson    schedule 18.05.2015    source источник
comment
Может быть, вы просто рисуете не тот регион? Глядя на оси на вашем контурном графике, они кажутся перевернутыми по сравнению с графиком тепловой карты. Что, если вместо этого установить ColumnCoordinates = arrayFromMinToMax2 и RowCoordinates = arrayFromMinToMax1?   -  person Anders Gustafsson    schedule 18.05.2015
comment
Спасибо, что указали на это, Андерс, но результат тот же. Однако я обновил изображение.   -  person Mats Isaksson    schedule 19.05.2015
comment
Если вы посмотрите на HeatMapSeriesExamples он даже объединяет тепловую карту с контурами, поэтому контуры должны быть действительно простыми. Пусть ContourSeries сам определяет уровни и цвета, т.е. удалите свойства ContourLevels и ContourColors из инициализатора и посмотрите, даст ли это какой-либо улучшенный результат.   -  person Anders Gustafsson    schedule 19.05.2015
comment
Я тоже так думал. Простой! И сочетание тепловой карты с контуром на самом деле было бы моим первым выбором для моего приложения. Когда я смотрю на масштаб моего пустого контурного графика и вижу, что он колеблется от 0 до 100, а данные такие же, как на тепловой карте, то есть от 0 до 0,08. Есть ли способ, которым это может быть проблематично?   -  person Mats Isaksson    schedule 19.05.2015
comment
Я протестировал масштабирование примера Peaks в ContourSeriesExamples, а также сместил его так, чтобы значения были между -0,03 и 0,07. Нет проблем с отображением контуров. Могу ли я порекомендовать вам начать с более простого набора данных и заставить ContourSeries работать для этого, а затем перейти к исходному набору данных? Кстати, а зачем нужно приводить data к double[,]?   -  person Anders Gustafsson    schedule 19.05.2015
comment
Еще одна вещь, хотя я не думаю, что это как-то повлияет на вашу проблему: вам не нужно добавлять LinearColorAxis к вашему PlotModel, когда вы рисуете ContourSeries. Кроме того, не могли бы вы где-нибудь опубликовать массив data, например. как Gist на Github или на ideone.com? Может быть, потоки данных усложняют работу генератора контуров?   -  person Anders Gustafsson    schedule 19.05.2015
comment
Андерс, приведение необходимо, потому что ‹код›данные‹/код› имеет определяемый пользователем тип, что-то вроде матричного класса.   -  person Mats Isaksson    schedule 19.05.2015


Ответы (1)


Я наконец нашел, что было не так - это была моя ошибка! Массивы ColumnCoordinates и RowCoordinates должны соответствовать размеру массива DoubleArray Data! И я не был уверен, что они были. Теперь контур и тепловая карта совпадают! Спасибо Андерсу за поддержку и за то, что подтолкнул меня к моему собственному коду!

Тепловая карта с контуром

person Mats Isaksson    schedule 19.05.2015