Aligning axes labels in 3D plots
191 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
Find more on Graphics Objects in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!