禁止图表刻度中的指数格式化

14

当刻度大于约10,000时,刻度标签将被格式化为1x10^4。指数部分出现在相应的轴上方,这种行为已经在matlab central上得到了很好的描述,但没有解决方案。

谢谢您的帮助。


这是一个“快速��巧”:

set(gca, 'YTickLabel',get(gca,'YTick'))

如下图所示,当应用于bar3时,未能起作用。

bar3 plot failing


看了你提供的线程,我发现有一个名为tick2text(http://www.mathworks.com/matlabcentral/fileexchange/16003-tick2text-create-easy-to-customize-tick-labels)的工具,似乎完美地解决了这个问题。 - Jonas
tick2text可以格式化刻度标签,但是轴上方的指数部分仍然存在,看起来非常奇怪。上面给出的新闻帖子也注意到了这个问题。 - zellus
tick2text所附的图片(http://www.mathworks.com/matlabcentral/fx_files/16003/4/tick2textexample.png)似乎表明情况并非如此。这张图片是错误的吗? - Jonas
好的观点!不幸的是,我手头没有这个问题的图表。它是一个带有色条和cmfreeze vodoo的bar3图。我承认对图形进行了相当大的调整。 - zellus
以下示例代码按预期工作!我将使用真实样本再次检查tick2text。y = cool(7); fh = figure; bar3(y*1E6,'detached'); ax = gca(fh); tick2text(ax, 'ztickoffset' ,-1.15,'zformat', '%5.0f', 'axis','z') - zellus
@zellus:我将其添加为答案,以备将来参考。 - Jonas
3个回答

10

编辑

根据这个技术解决方案页面,建议格式化刻度标签的方法是这样的(您可以使用任何数字格式化函数,如NUM2STR、SPRINTF、MAT2STR或其他任何函数...)

y = cool(7);
bar(y(:,1)*1e6)
set(gca, 'YTickMode','manual')
set(gca, 'YTickLabel',num2str(get(gca,'YTick')'))

alt text

然而,当涉及到Z轴时似乎存在一个错误(标签格式正确,但指数乘数仍然显示出来!)


注:该文中的“Z轴”指的是图表中的坐标轴。
y = cool(7);
bar3(y*1e6, 'detached')
set(gca, 'ZTickMode','manual')
set(gca, 'ZTickLabel',num2str(get(gca,'ZTick')'))

alt text

最后,还有一种解决方法是用文本对象替换刻度标签(参见此技术解决方案页面):

y = cool(7);
bar3(y*1e6, 'detached')
offset = 0.25; Xl=get(gca,'XLim'); Yl=get(gca,'YLim'); Zt=get(gca,'ZTick');
t = text(Xl(ones(size(Zt))),Yl(ones(size(Zt)))-offset,Zt, num2str(Zt')); %#'
set(t, 'HorizontalAlignment','right', 'VerticalAlignment','Middle')
set(gca, 'ZTickLabel','')

alt text


非常感谢您的解决方案!在我搜索解决方案时,我也遇到了您提到的“技术解决方案”,但没有看到它的相关性。现在问题已经准备好提交给MathWorks支持团队了! - zellus

3

你可以尝试的另一个技巧是在绘图之前对数据进行缩放,然后缩放刻度标签,使其看起来像是在不同的比例尺上绘制的。你可以使用函数LOG10,根据你的绘制值自动计算适当的比例因子。假设你的数据存储在变量xy中,你可以尝试这样做:

scale = 10^floor(log10(max(y)));  %# Compute a scaling factor
plot(x,y./scale);                 %# Plot the scaled data
yTicks = get(gca,'YTick');        %# Get the current tick values
set(gca,'YTickLabel',num2str(scale.*yTicks(:),'%.2f'));  %# Change the labels

好的解决方案,但我可能更喜欢处理图形部分而不是数据。 - zellus
@zellus 你应该能够使用 hgtransform 对象来缩放显示的数据。那就是我们最终采用的解决方案。绘图数据不受影响,但以其实际值的1/1000显示。 - KitsuneYMG
太棒了。如何转换轴上的值相当不容易。 - pbarill

1

获得更好的刻度标签控制并避免使用指数格式的一种方法是使用来自文件交换中心的TICK2TEXT

这里有一个例子:

y = cool(7); %# define some data
ah = axes; %# create new axes and remember handle
bar3(ah,y*1E6,'detached'); %# create a 3D bar plot
tick2text(ah, 'ztickoffset' ,-1.15,'zformat', '%5.0f', 'axis','z') %# fix the tick labels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接