Matlab绘图中去除刻度标签的科学计数法

11

我在Matlab中制作了一个图表,使用的方法是:

hold on
plot(t1,Dx1,'r')
xlabel('t (ps)')
ylabel('Deviation of coordinate from initial coordinate (Å)')
plot(t1,Dy1,'g')
plot(t1,Dz1,'b')
hold off

然而,y轴上的刻度标签以科学计数法生成:

Scientific Notation on y-axis

有没有办法去除科学计数法,只让y标签范围从-0.0025到0.0005?谢谢!

6个回答

11
你可以尝试使用sprintf手动设置刻度标签:

您可以尝试使用sprintf手动设置刻度标签:

yt = get(gca,'YTick');
set(gca,'YTickLabel', sprintf('%.4f|',yt))

啊,你只比我快了几秒钟...;-)。无论如何,你应该将“xtick”和“xticklabel”替换为“ytick”和“yticklabel”。第二行末尾的x应更改为xt。 - H.Muster
1
:) - 我正要开始,突然接到了一个电话! - robince
1
第二行末尾的x仍然是错误的。我猜应该是yt。 - H.Muster
我发现这是一个可怕的解决方法,因为如果你在屏幕上重新调整图形并且坐标轴上的刻度数目改变,你最终会得到错误的标签。 - wsj

7
在创建轴之后,尝试添加以下内容:
ax = gca;
ax.YAxis.Exponent = 0;

以下是一个示例:

x = 0:0.1:10;
y = 1000*x.^2;

%Plot with default notation:

subplot(1,2,1)
plot(x,y)


%Plot without exponent:

subplot(1,2,2)
plot(x,y)
ax = gca
ax.YAxis.Exponent = 0;

1
我阅读了数十个答案,这个是最好的!!!谢谢@GHH! - Nike

4
我也曾经尝试过将我的绘图轴固定为常规表示法而非科学计数法。 对我来说最令人沮丧的部分是,即使在手动重新分配刻度标签以达到常规表示法后,“x10 ^ 4”标签仍将保留在图框边缘。 最终,在感谢上述文章后,我找到了问题所在 - 图形渲染器。 我使用的是“OpenGL”。 当我改成“zbuffer”时,当我手动重置刻度标签时,“x10 ^ 4”标签会正确消失。
这是一个示例代码,应用了格式“###,###.0”到y轴标签,并且甚至在缩放/平移等操作时动态更新y标签,由于我在Matlab文件交换中找到的两个有用函数。 找到其他两个函数的位置包括在示例函数下面的注释中。
function []=TickFixExample()

figure %this one works
myRenderer='zbuffer';
set(gcf,'Renderer', myRenderer); 
axesh = axes();
set(gca,'YLim',[20000 20100]);
title(myRenderer)
ticklabelformat(gca,'y','###,###.0');

figure %this one doesn’t work
myRenderer='OpenGL';
set(gcf,'Renderer', myRenderer); 
axesh = axes();
set(gca,'YLim',[20000 20100]);
title(myRenderer)
ticklabelformat(gca,'y','###,###.0');

函数ticklabelformat(hAxes,axName,format)由Y. Altman编写,可以在以下网址找到:http://www.mathworks.com/matlabcentral/fileexchange/36254-ticklabelformat-set-a-dynamic-format-of-axes-tick-labels,或通过谷歌搜索“ticklabelformat matlab”获得。我稍微修改了它,将第105行更改为:

 tickLabels = arrayfun(@(x)(FormatNumberScalarInputStrOutput`(x,format)),tickValues,'UniformOutput',false);`

以替代奥特曼版本:
tickLabels = arrayfun(@(x)(sprintf(format,x)),tickValues,'UniformOutput',false);

这个修改提供了千位分隔符功能,实现方法是通过函数 y = NumberFormatter( Numbers , FormatPattern ) ,作者是 S. Lienhard,该函数也可以在Matlab文件交换平台上找到。下面是我修改后的Lienhard代码的完整版本:

function y = FormatNumberScalarInputStrOutput(Number ,FormatPattern)

 % adapted 12-2012 by D. Bourgoyne from NUMBERFORMATTER by S. Lienhard
% 
%   The pound sign (#) denotes a digit, the comma is a placeholder for the
%   grouping separator, and the period is a placeholder for the decimal
%   separator.
%   The pattern specifies leading and trailing zeros, because the 0
%   character is used instead of the pound sign (#).
% 
%   Examples:
%   NumberFormatter(rand(5),'0.000')
%   NumberFormatter(rand(5)*100,'###,###.000') 
import java.text.*
v = DecimalFormat(FormatPattern);
y = char(v.format(Number));

1
您可以使用此代码来控制y轴刻度标签的格式。该代码源自ticks_format.m。
%在此处设置首选刻度格式。
y_formatstring = '%3.4f';

% 这是代码。

ytick = get(gca, 'ytick');
for i = 1:length(ytick)
    yticklabel{i} = sprintf(y_formatstring, ytick(i));
end
set(gca, 'yticklabel', yticklabel)

1

您需要编写以下内容:

set(gcf, 'renderer', 'zbuffer')

0
在较新版本的Matlab(2016b)中,您可以使用ytickformat和xtickformat函数轻松更改标签的格式。

我没有找到任何可能通过这个选项关闭指数符号的方法 =( - user2305193
是的,这个不行。即使使用了应该被修复的%f,它仍然为整个轴使用全局指数。 - Timmmm

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