Как построить трехмерную зависимость

fass965

Обычно я строю трёхмерные зависимости в виде двумерной карты, где цвет означает третье измерение с помощью функции pcolor в matlab или pylab (в python). Мне хочется добавить по бокам так же одномерные графики, которые будут показывать проекции на ту и другую ось (то есть вдоль другой оси все значения проинтегрированы подобно тому, как это сделано здесь:

Кто-нибудь знает как такое можно сделать в matlab/pylab? (в принципе приветствуется любой - желательно свободный - инструмент, который бы работал под всеми современными версиями систем gnu/linux, ms windows и apple mac os).

fass965

Если присмотреться к твоей картинке, то ее авторы получили ее скорее всего просто наложением рисунков в графическом редакторе.
Даже если так, то мне хочется всё же такое автоматизировать, так как мне подобные рисунки нужны регулярно и большом объёме.
По теме: в гнуплоте есть команда multiplot, позволяющая рисовать несколько графиков на одном рисунке. Это гемор :(
Спасибо, посмотрю.
P.S. Зачем по теме писать в оффтопике?

fass965

http://matplotlib.org/examples/pylab_examples/axes_demo.html
Спасибо за ссылку, но там показано как делать вставки. Это совсем не то, что я хочу. В моём примере графики выровнены и имеют общую ось координат.
Хотя поиграться стоит - может что-то подобное и получу...

natastream

но там показано как делать вставки
там показано как на одном холсте отрисовать оси произвольного размера в произвольном положении

natastream

fass965

О!
А можно код для этого конкретного рисунка?

Niklz

есть функция scatterist: http://www.mathworks.cn/cn/help/stats/scatterhist.html
ну или можно наложением графиков: http://www.mathworks.com/matlabcentral/newsreader/view_threa...

natastream


figure
a = axes([0.2,0,0.8,0.8])
x = linspace(-1,1,100)
yy,xx = meshgrid(x,x)
contourf(xx**2+yy**2,100)
a = axes([0,0,0.2,0.8])
plot(-x**2,x)
a = axes([0.2,0.8,0.8,0.2])
plot(x,x**2)

scorobei42ru

Посмотри свойство position для осей в матлабе. Добавляешь к фигуре нужное тебе количество осей, их положение и размеры, и шаблон готов.

Evgewkin

В gnuplot есть пример похожий
http://gnuplot.sourceforge.net/demo/margins.html

fass965

Спасибо всем!
Я уже разобрался через Matlab.
Сделал с помощью subplot. Вот функцию написал для этого:

function [fig] = plotCoincidence(X,Y,C,limX,limY,limC,labelX, labelY)
%plotCoincidence(x,y,z,limX,limY,limZ) - plots coincidence map with additional graphs of integrals among different axes
% X and Y - are vectors or matrices for grid
% C - matrix to plot
% limX, limY, limC - two-element vectors for limits among different axes
% labelX, labelY - labels of axes

fig = figure;

%top plot - integral along Y axis
hTop = subplot(2,2,2);
plot(X, mean(C,1 'Color', [0, 0, 0]);
if exist('limX')
xlim(limX);
end
set(hTop, 'XMinorTick', 'on');
set(hTop, 'XGrid', 'on');
set(hTop, 'XAxisLocation', 'top');
set(hTop, 'YTick', []);
set(hTop, 'Position', [0.21 0.705 0.6 0.2]);

%left plot - integral along X axis
hLeft = subplot(2,2,3);
plot(Y, mean(C,2 'Color', [0, 0, 0]);
if exist('limY')
xlim(limY);
end
camroll(90);
set(hLeft, 'XAxisLocation', 'top');
set(hLeft, 'XMinorTick', 'on');
set(hLeft, 'XGrid', 'on');
set(hLeft, 'YTick', []);
set(hLeft, 'Position', [0.055 0.1 0.15 0.6]);

%main color map
hCenter = subplot(2,2,4);
pcolor(X,Y,C);
colorbar;
shading flat;
if exist('limX')
xlim(limX);
end
if exist('limY')
ylim(limY);
end
if exist('limC')
caxis(limC);
end
colormap(gray);
colormap(flipud(colormap;
set(hCenter, 'TickDir', 'out');
set(hCenter, 'YAxisLocation', 'right');
set(hCenter, 'XMinorTick', 'on');
set(hCenter, 'YMinorTick', 'on');
set(hCenter, 'Position',[0.21 0.1 0.6 0.6]);
if exist('labelX')
xlabel(labelX);
end
if exist('labelY')
ylabel(labelY);
end
end

Вот такая фигня получается на моих реальных данных:
Оставить комментарий
Имя или ник:
Комментарий: