如Dennis的答案所示,您可以利用一些未记录的功能添加额外的轴。这有一些缺点,明显的是未记录的功能往往会在没有通知的情况下更改。此外,在同样的方式(即在相反的一侧)添加额外的x
或y
轴将导致它被图表遮挡并且不太有用。像这个问题的答案中所示,在3D中实现轴堆叠在一侧的效果将更加理想。然而,这可能会有些混乱,我还没有找到一种与绘图变化(即旋转、缩放、更改限制等)良好协作的稳健方法。
不需要添加另一个轴线,更紧凑的解决方案是利用现有轴线的刻度线,并在新比例尺上简单地添加额外的刻度标签。可以使用TeX标记对额外的刻度(和轴)标签进行着色以区分它们。
我将一些代码包装到原型函数中来实现此功能。输入为轴句柄、字符串(
'X'
、
'Y'
或
'Z'
)用于修改轴、新比例尺的轴限制(将映射到当前限制)、新标签的颜色(作为
RGB三元组),以及新
轴标签的字符串:
function add_scale(hAxes, axisStr, newLimits, newColor, newLabel)
axisStr = upper(axisStr);
hRuler = get(hAxes, [axisStr 'Axis']);
labelColor = ['\color[rgb]{' sprintf('%f ', hRuler.Label.Color) '}'];
tickColor = ['\color[rgb]{' sprintf('%f ', hRuler.Color) '}'];
newColor = ['\color[rgb]{' sprintf('%f ', newColor) '}'];
tickValues = hRuler.TickValues;
limits = hRuler.Limits;
newValues = newLimits(1)+...
diff(newLimits).*(tickValues-limits(1))./diff(limits);
formatString = ['\' tickColor hRuler.TickLabelFormat '\\newline\' ...
newColor hRuler.TickLabelFormat '\n'];
newTicks = strsplit(sprintf(formatString, [tickValues; newValues]), '\n');
hRuler.Label.String = {[labelColor hRuler.Label.String]; ...
[newColor newLabel]};
hRuler.TickLabels = newTicks(1:(end-1));
end
这里是一个例子:
[X, Y, Z] = peaks(25);
hSurf = surfc(Z);
hAxes = gca;
ylabel('Distance (inches)');
add_scale(hAxes, 'Y', hAxes.YLim.*2.54, [1 0 0], 'Distance (cm)');
新的刻度标签(红色)添加在现有刻度标签下方,新的轴标签也是如此。可能可以创建
监听器以自动更新新标签(例如当刻度标记更改时),但我尚未完全解决这些细节问题。
z
轴还是多个y
轴? - gnovice