una - subplot matlab
¿Es posible vincular los ejes de dos gráficos de superficie para la rotación en 3D? (2)
Digamos que tengo dos matrices bidimensionales de igual tamaño y creo una gráfica de superficie para cada una de ellas.
¿Hay alguna manera de vincular los ejes de ambos gráficos, de modo que uno pueda rotarlos en 3D simultáneamente en la misma dirección?
Jugar con ActionPostCallback
y ActionPreCallback
es ciertamente una solución, pero probablemente no la más eficiente. Se puede usar la función linkprop
para sincronizar la propiedad de posición de la cámara.
linkprop([h(1) h(2)], ''CameraPosition''); %h is the axes handle
linkprop
puede sincronizar cualquiera de las propiedades gráficas de dos o más axes
(2D o 3D). Se puede ver como una extensión de la función linkaxes
que funciona para trazados 2D y sincroniza solo los límites de los axes
. Aquí, podemos usar linkprop
para sincronizar la propiedad de posición de la cámara, CameraPosition
, la que se modifica cuando uno gira un axes
.
Aquí hay un código
% DATA
[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;
Z1 = sin(R)./R;
Z2 = sin(R);
% FIGURE
figure;
hax(1) = subplot(1,2,1); %give the first axes a handle
surf(Z1);
hax(2) = subplot(1,2,2); %give the second axes a handle
surf(Z2)
% synchronize the camera position
linkprop(hax, ''CameraPosition'');
Puede tener una lista de propiedades gráficas con
graph_props = fieldnames(get(gca));
Una forma es registrar una devolución de llamada en eventos de rotación y sincronizar el nuevo estado en ambos ejes.
function syncPlots(A, B)
% A and B are two matrices that will be passed to surf()
s1 = subplot(1, 2, 1);
surf(A);
r1 = rotate3d;
s2 = subplot(1, 2, 2);
surf(B);
r2 = rotate3d;
function sync_callback(~, evd)
% Get view property of the plot that changed
newView = get(evd.Axes,''View'');
% Synchronize View property of both plots
set(s1, ''View'', newView);
set(s2, ''View'', newView);
end
% Register Callbacks
set(r1,''ActionPostCallback'',@sync_callback);
set(r1,''ActionPreCallback'',@sync_callback);
set(r2,''ActionPostCallback'',@sync_callback);
set(r2,''ActionPreCallback'',@sync_callback);
end