LINUX.ORG.RU

Аппроксимировать плотность распределения точек на плоскости

 ,


0

1

Как под линуксом построить вот такой график? http://www.nature.com/nphys/journal/v7/n10/images/nphys2021-f2.jpg , density matrix

данные заданы в виде двух целочисленных столбцов:

0 0
2 2
1 0
1 0
5 2
2 2
0 0
1 1
0 0
...
dpkg -L gnuplot | grep demos изучать слишком долго, там нет скриншотов. А на странице http://gnuplot.sourceforge.net/demo/ я не понял где пример формирования density matrix.

Подскажите, как проще? По-сути, нужна аппроксимация плотности двумерным сплайном -> отображение в виде heatmaps.

★★★★★

можно так

Two-dimensional kernel density estimation with an axis-aligned bivariate normal kernel, evaluated on a square grid.

Usage:

kde2d(x, y, h, n = 25, lims = c(range(x), range(y)))

attach(geyser) f2 <- kde2d(duration, waiting, n = 50, lims = c(0.5, 6, 40, 100), h = c(width.SJ(duration), width.SJ(waiting)) ) image(f2, zlim = c(0, 0.05))

anonymous
()

contourf - функция в матлабе (наверно, в октаве тоже) строит такие графики.

anonymous
()

Тупой вариант: каждой точке данных сопоставить 2D гауссову функцию и найти сумму этих функций в каждой точке сетки. Если я правильно понял, это то же самое, что и

Two-dimensional kernel density estimation with an axis-aligned bivariate normal kernel, evaluated on a square grid.

dmfd
()
Ответ на: комментарий от dmfd

И смысл сего комментария, ну кроме того, чтобы показать «мол сам додумался до того, для чего уже придумали целый термин»?

anonymous
()
Ответ на: комментарий от abalakin

В принципе, udav/MathGL что-то строит:

read a '/home/pacify/sample.dat'
axis
alpha
dens a
но не совсем то, что мне нужно. Проще на C+OpenGL написать программку.

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

Скорее уж так:

# убедитесь, что читаете двумерный массив a_{ij}
read a '/home/pacify/sample.dat'
subplot 2 2 0:title 'input'
axis
crange a:dens a '#'
subplot 2 2 1:title 'output'
...

или тоже самое на C/C++

mglData a; // заполняется Вами
mglGraph gr;

gr.SubPlot(2,2,0); gr.Title("Input");
gr.Axis();
gr.SetRange('c',a); gr.Dens(a,"#");

gr.SubPlot(2,2,1); gr.Title("Output");
...

но не совсем то, что мне нужно. Проще на C+OpenGL написать программку.

Это как Вам нравится. Только со шрифтами намучаетесь и с пр.

abalakin ★★
()
Ответ на: комментарий от abalakin

Только со шрифтами намучаетесь и с пр.

Не совсем. При попытке скролла/зума построенного графика:

$ udav
Ошибка сегментирования

pacify ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.