1

我正在使用带有 F# 的 OxyPlot。我有创建单个参数直方图并绘制它的代码。我的轮廓形式的双参数直方图代码太耗时了。我想要一种将两个向量或数组映射到二维直方图的有效方法。我包括我的常规直方图代码。

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, ] 并将它们放入特定分辨率的 bin 中以创建直方图 [x,y]。OxyPlot 需要直方图才能创建轮廓。

想象一下两个数据数组,一个称为 Alexa647-H,另一个称为 BV786-H。每个数组包含 100,000 个介于 0 和 10,000 之间的整数。您可以在 OxyPlot 中将这些数组绘制为点图。这很简单,只需为 X 轴绘制一个数组,为 Y 轴绘制一个数组。我在下面包含了一个情节。

我的问题涉及使用相同的数据创建等高线图。为此,我需要首先确定一个分辨率,例如为方便起见 100x100。因此,我想得到一个二维数组调用 hist2(100,100)。该数组基本上是 10,000 个大小为 1000x1000 的 bin。每个 bin 包含属于特定范围的元素的计数 - 一个 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 代码生成的图

我希望这能解决问题。

大学教师

4

0 回答 0