Aligning axes labels in 3D plots
31 views (last 30 days)
Show older comments
I've been playing around for several hours trying to get the x and y labels in a 3D plot to align properly. The following code creates an isometric view, for which the axis angles should be 30° (which is correctly computed).
figure;
axh = axes;
Z = peaks(20);
surf(Z)
xlabel('x-axis');
ylabel('y-axis');
azimuth = -45;
elevation = 35.264;
% Isometric view, c. f. https://en.wikipedia.org/wiki/Isometric_projection
view(axh,azimuth,elevation);
camproj % returns 'orthographic'
unitx = [1;0;0];
unity = [0;1;0];
unitz = [0;0;1];
projectedunitx = rotx(elevation) * rotz(-azimuth) * unitx;
projectedunity = rotx(elevation) * rotz(-azimuth) * unity;
xlabelangle = atan2d(projectedunitx(3),projectedunitx(1)) %#ok
ylabelangle = -(180 - atan2d(projectedunity(3),projectedunity(1))) %#ok
xlabelhandle = axh.XLabel;
ylabelhandle = axh.YLabel;
xlabelhandle.Rotation = xlabelangle;
ylabelhandle.Rotation = ylabelangle;
xlimits = xlim(axh);
ylimits = ylim(axh);
zlimits = zlim(axh);
xmean = mean(xlimits);
ymean = mean(ylimits);
xbottom = xlimits(1);
ybottom = ylimits(1);
zbottom = zlimits(1);
xlabelhandle.Position = [xmean ybottom zbottom];
ylabelhandle.Position = [xbottom ymean zbottom];
Yet in the plot the labels don't align exactly parallel to the axes:

The error is relatively small, but I'd like to have an exact solution. It appears Matlab doesn't exactly adhere to the rules of orthographic projection because in a truly isometric view (which is orthographic), the axes angles are 30°. Is there some way to get the alignment (mathematically) right? (I'm aware of this FEX function https://mathworks.com/matlabcentral/fileexchange/49542-phymhan-matlab-axis-label-alignment but it doesn't seem to work in R2020b.)
0 Comments
Accepted Answer
Dave B
on 1 Apr 2022
The differrence between your labels and the axes is because MATLAB stretches an axes to fill the space of its container - if you made your figure wider the angles would become flatter. To get the exact angle, axis equal should do the trick:
figure;
axh = axes;
Z = peaks(20);
surf(Z)
xlabel('x-axis');
ylabel('y-axis');
azimuth = -45;
elevation = 35.264;
% Isometric view, c. f. https://en.wikipedia.org/wiki/Isometric_projection
view(axh,azimuth,elevation);
camproj % returns 'orthographic'
unitx = [1;0;0];
unity = [0;1;0];
unitz = [0;0;1];
projectedunitx = rotx(elevation) * rotz(-azimuth) * unitx;
projectedunity = rotx(elevation) * rotz(-azimuth) * unity;
xlabelangle = atan2d(projectedunitx(3),projectedunitx(1)) %#ok
ylabelangle = -(180 - atan2d(projectedunity(3),projectedunity(1))) %#ok
xlabelhandle = axh.XLabel;
ylabelhandle = axh.YLabel;
xlabelhandle.Rotation = xlabelangle;
ylabelhandle.Rotation = ylabelangle;
xlimits = xlim(axh);
ylimits = ylim(axh);
zlimits = zlim(axh);
xmean = mean(xlimits);
ymean = mean(ylimits);
xbottom = xlimits(1);
ybottom = ylimits(1);
zbottom = zlimits(1);
xlabelhandle.Position = [xmean ybottom zbottom];
ylabelhandle.Position = [xbottom ymean zbottom];
axis equal
More Answers (0)
See Also
Categories
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!