F # массив в 2D гистограмму - PullRequest
       24

F # массив в 2D гистограмму

0 голосов
/ 11 октября 2018

Я использую OxyPlot с F #.У меня есть код, чтобы создать гистограмму с одним параметром и построить его.Мой код для двухпараметрических гистограмм в форме контура слишком трудоемкий.Я хотел бы эффективный способ отобразить два вектора или массива в 2D гистограмму.Я включил свой код для обычной гистограммы.

let myHistogram c =
flatten dataArray.[c..c,*] 
|> Seq.toArray
|> Array.map (fun x -> round(float(x)/16.0))
|> Seq.countBy (fun x -> x)
|> Seq.sort
|> Seq.map snd

Итак, я собираюсь взять dataArray. [A… a, ], dataArray [b… b, ] ипоместите их в ячейки определенного разрешения, чтобы создать гистограмму [x, y].Для создания контура OxyPlot необходима гистограмма.

Представьте себе два массива данных, один из которых называется Alexa647-H, а другой - BV786-H.Каждый массив содержит 100 000 целых чисел в диапазоне от 0 до 10000.Вы можете построить эти массивы как точечный график в OxyPlot.Это просто, просто нарисуйте один массив для оси X и один массив для оси Y.Я включил график ниже.

Мой вопрос касается создания контурного графика из тех же данных.Для этого мне нужно сначала определить разрешение, скажем для удобства 100x100.Поэтому я хочу закончить с вызовом двумерного массива hist2 (100,100).Массив в основном состоит из 10 000 ячеек размером 1000x1000.Каждая ячейка содержит количество элементов, попадающих в определенный диапазон - 2D-гистограмма.

Точка и контур

Пример кодирования в OxyPlot математически генерирует массив пиков,Вместо этого я хочу сгенерировать этот массив пиков входного контура, как показано выше.

    var model = new PlotModel { Title = "ContourSeries" };

double x0 = -3.1;
double x1 = 3.1;
double y0 = -3;
double y1 = 3;

//generate values
Func<double, double, double> peaks = (x, y) => 3 * (1 - x) * (1 - x) * Math.Exp(-(x * x) - (y + 1) * (y + 1)) - 10 * (x / 5 - x * x * x - y * y * y * y * y) * Math.Exp(-x * x - y * y) - 1.0 / 3 * Math.Exp(-(x + 1) * (x + 1) - y * y);
var xx = ArrayBuilder.CreateVector(x0, x1, 100);
var yy = ArrayBuilder.CreateVector(y0, y1, 100);
var peaksData = ArrayBuilder.Evaluate(peaks, xx, yy);

var cs = new ContourSeries
{
        Color = OxyColors.Black,
        LabelBackground = OxyColors.White,
        ColumnCoordinates = yy,
        RowCoordinates = xx,
        Data = peaksData
};
model.Series.Add(cs);

График, сгенерированный кодом OxyPlot

Надеюсь, это прояснит ситуацию.

Дон

...