嗨我遇到的问题是我的数据集范围在-10 ^ 3到10 ^ 3之间
我需要能够将其绘制为对数刻度,但半月期不能绘制负值
比方说我的数据是:
x = [-3,-2,-1,0,1,2,3];
y = [-1000,-100,-10,1,10,100,1000];
(或一般y=sign(x).*10.^abs(x);
)
如何在MATLAB中用对数刻度绘制?如果可能的话,如果对数刻度也可以在Y轴上,那将是很好的
答案 0 :(得分:4)
将您的实际数据用作标签,但使用log10
缩放绘制的数据。
% data
x = -3:0.1:3;
y = sign(x).*10.^abs(x);
% scaling function
scale = @(x) sign(x).*log10(abs(x));
N = 7; % number of ticks desired
% picking of adequate values for the labels
TickMask = linspace(1,numel(y),N);
YTickLabels = y(TickMask);
% scale labels and plotdata, remove NaN ->inconsistency, do you really want that?
YTick = scale( YTickLabels );
Y = scale(y);
YTick(isnan(YTick)) = 0;
Y(isnan(Y)) = 0;
% plot
plot(x,Y)
set(gca,'YTick',YTick,'YTickLabels',YTickLabels)
grid on
N = 7
:
N = 11
如何查找N
的有效值?
以下函数(thanks to gnovice)将返回您为N
选择的所有可能值:
n = numel(x);
N = find(rem(n./(1:n), 1) == 0) + 1;
关于半学院风格的标签:在剧情前加上以下一行:
YTickLabels = cellfun(@(x) ['10^' num2str(x)], num2cell(YTick),'UniformOutput',false)
你至少可以达到以下目的: 不是很漂亮而不是通用,但对你来说是个好点。
答案 1 :(得分:1)
你不能使对数轴过零的原因是它没有意义! 由于对数标度通常显示为例如。 100 - 10 - 1 - 1/10 - 1/100 - ...,你需要一个无限的空间来使轴交叉为零。
答案 2 :(得分:0)
这个怎么样:
x=logspace(-3,3);
y=sign(x).*10.^abs(x);
loglog(x,y)
答案 3 :(得分:0)
@thewaywewalk已经提供了一个漂亮的解决方案。我建议的是对它的epsilon改进。如果您进行两项更改 (a)定义一个新的MATLAB函数信号,该信号基本上从数字前提取符号。
function value = signia(x)
if(x>=0)
value = '';
else
value = '-';
end
和(b)进行了这一小的更改,而不是
YTickLabels = cellfun(@(x) ['10^' num2str(x)], num2cell(YTick),'UniformOutput',false)
您使用
YTickLabels = cellfun(@(x) [signia(x) '10^{' num2str(x) '}'], num2cell(YTick),'UniformOutput',false);
(注意花括号的存在),您将在Y刻度显示中得到改善。我得到以下。 enter image description here