您好,我遇到了一个问题,我的数据集范围在-10^3到10^3之间。
我需要以对数刻度绘制此数据,但是semilogy无法绘制负值。
例如,我的数据如下:
x = [-3,-2,-1,0,1,2,3];
y = [-1000,-100,-10,1,10,100,1000];
(或者一般情况下使用y=sign(x).*10.^abs(x);
)
如何在MATLAB中使用对数刻度绘制此图形?如果可能的话,最好是对数刻度刻度线也在Y轴上。
您好,我遇到了一个问题,我的数据集范围在-10^3到10^3之间。
我需要以对数刻度绘制此数据,但是semilogy无法绘制负值。
例如,我的数据如下:
x = [-3,-2,-1,0,1,2,3];
y = [-1000,-100,-10,1,10,100,1000];
(或者一般情况下使用y=sign(x).*10.^abs(x);
)
如何在MATLAB中使用对数刻度绘制此图形?如果可能的话,最好是对数刻度刻度线也在Y轴上。
使用实际数据作为标签,但使用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
值?
以下函数(感谢gnovice)将返回您可以选择的所有可能值,用于N
:
n = numel(x);
N = find(rem(n./(1:n), 1) == 0) + 1;
关于semilogy样式标签:在绘制图表之前添加以下行:
YTickLabels = cellfun(@(x) ['10^' num2str(x)], num2cell(YTick),'UniformOutput',false)
@thewaywewalk已经提供了一个很好的解决方案。我建议的是在此基础上进行微小改进。如果您进行两个更改: (a) 定义一个新的MATLAB函数signia,它基本上提取数字前面的符号。
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);
x=logspace(-3,3);
y=sign(x).*10.^abs(x);
loglog(x,y)