2

我在 IEEE 期刊论文中遇到了 y 轴的奇怪缩放。

从上到下

y_axis = [0.9999 0.9995 0.999 0.995 0.99 0.98 0.95 0.9 0.8 0.7 0.5 0.3 0.2 0.1 0.05 0.02 0.01 0.005 0.001 0.0005 0.0001]。

缩放不是对数的。刻度之间的间距不相等。当然,它不是线性的。您可以仅在一个 y 轴上详细查看大数字 (0.9... 0.999) 和非常小的数字 (0.0001... 0.1)。我不知道如何在 MATLAB 中进行操作。我用谷歌搜索了它,但我找不到。谁能帮我?提前致谢。

图为如下代码:

clear all
close all
set(0,'defaulttextinterpreter','latex')
P_tb = 1e-2;
Ntrial = 1e7;                  % # of Monte Carlo trials
jey=sqrt(-1);
omega_db = -15;                % sidelobe gain of main antenna
omega = db2pow(omega_db);      % omega in linear scale 
F_db = [-5 -2 0 2 5];
JNR_db = -5:20;
beta_db = 2;
F_lin = 10.^(0.1*F_db);
JNR = 10.^(0.1*JNR_db);
beta = 10.^(0.1*beta_db);
temp = cell (length(F_db),1);
P_b = zeros (length(JNR_db), length(F_db));
for ii = 1:length(F_db)
    SNR = JNR;
    x = sqrt(omega);
    F = F_lin(ii);
    P_b(:,ii) = 1 - 1./(F+1).*(1-marcumq(x.*sqrt(2.*SNR./(F+1)),sqrt(2.*SNR.*F./(F+1))))-F./(F+1).*marcumq(sqrt(2.*SNR.*F./(F+1)), x.*sqrt(2.*SNR./(F+1)));
    temp (ii) = {['$F=$' num2str(F_db(ii)) ' dB']};
end
figure,
h = plot(JNR_db, (P_b));
set(gca,'YTick',fliplr([0.9999 0.9995 0.999 0.995 0.99 0.98 0.95 0.9 0.8 0.7 0.5 0.3 0.2 0.1 0.05 0.02 0.01 0.005 0.001 0.0005 0.0001]))
set(gca,'YTickLabel',num2cell(fliplr([0.9999 0.9995 0.999 0.995 0.99 0.98 0.95 0.9 0.8 0.7 0.5 0.3 0.2 0.1 0.05 0.02 0.01 0.005 0.001 0.0005 0.0001])));
 grid on
4

4 回答 4

3

在 OP 发布的图中,刻度线根本不是均匀分布的。此外,轴的比例是 sigmoidal 的倒数(见下文)。要真正了解那篇论文的作者做了什么,我们可以将这个数字骨架化

im = conv2(im, fspecial('gaussian', [5, 5], 2));
im = ~bwmorph(im < 2.5, 'skel', inf);

并获得准确的位置y_px,如

y_px = flipud(find(im(:, 285) == 0));
y_px([1, 2, 3, 11, 15, 19, 28]) = [];

我正在删除一些来自趋势线或 x 轴的 -10 刻度标记标签的检测。

如果您将 y-tick 标签y_val(翻转y_axis为升序)绘制为这些像素位置的函数y_px,则可以确认该关系完全符合 @chapjc 建议的 Sigmoidal 关系。但是,为了生成相似的图,您可能更希望反转公式并定义一个函数

px_y = @(y) log(-y ./ (y - 1));

然后您可以使用此功能进行绘图。您所指的论文显示了一个范围内的数据x = -10 : 0.1 : 4。让我们在同一范围内绘制一个介于 0.0001 和 0.9999 之间的正弦函数。请注意,我们使用缩放函数px_y,然后替换 y-tick 位置标签

plot(x, px_y(0.7 + sin(x) / 4));
set(gca(), 'ytick', px_y(y_val), 'yticklabel', num2cell(y_val));

导致看起来像这样的东西

在此处输入图像描述

总之,您可以定义一个函数y_px来转换您的 y 数据,然后设置轴的ytickyticklabel属性。无论您为此方法选择何种比例,使用相同函数转换值和所有 y 数据 都很重要。ytick

于 2013-11-03T01:46:30.783 回答
1

要了解此自定义 y 轴空间,您可以执行plot(linspace(-5,5,numel(y_axis)),fliplr(y_axis),'r'). 这看起来很像剂量曲线,所以绘制一个我用 找到的方程hold on; x=-5:0.01:5; plot(x,exp(x)./(1+exp(x)))。这是它的样子:

在此处输入图像描述

表格看起来不错。其中一个术语可能有一个常数来调整形状。如果你想把你的数据放在这个空间里,应用这个函数(yscFun = @(x) exp(x)./(1+exp(x))yscFun = @(x) 1./(1+exp(-x)))。然后按照 nispio 的建议将刻度标签设置为y_axiswith 。set(gca,'YTickLabel',num2cell(fliplr(y_axis)));

于 2013-11-02T22:00:35.137 回答
1

enter image description hereThis is the final solution that I found. Thank you very much. I did not know the sigmoid function. Below are the MATLAB codes for this puporse.

close all
clear all
%your desired y_ticks
y_axis = [0.9999 0.9995 0.999 0.995 0.99 0.98 0.95 0.9 0.8 0.7 0.5 0.3 0.2 0.1 0.05 0.02 0.01 0.005 0.001 0.0005 0.0001];
%order in increasing way
y_val = fliplr (y_axis);
% the Sigmoid function and its inverse
py_x = @(x) 0.5*erf(x*sqrt(pi/8)) + 0.5;
px_y = @(x) sqrt (8/pi)*erfinv (2*x - 1);

beta = 10^(0.1*-15);
F = 10^(0.1*-5);
JNR_db = -5:20;
SNR = 10.^(0.1.*JNR_db);
% my original data
P_b = @ (x) 1 - 1./(F+1).*(1-marcumq(x.*sqrt(2.*SNR./(F+1)),sqrt(2.*SNR.*F./(F+1))))-F./(F+1).*marcumq(sqrt(2.*SNR.*F./(F+1)), x.*sqrt(2.*SNR./(F+1)));
P_b1 = P_b(sqrt(beta));
% tranfrom it using inverse function
P_b2 = px_y(P_b1);
figure,
plot(JNR_db, P_b2);
grid on
ylim ([ px_y(0.0001) px_y(0.9999) ]);
% tranform the desired y_tick using inverse function
set(gca(), 'ytick', px_y (y_val));  
set (gca (), 'yticklabel', num2cell(y_val));
% % Sigmoid function verification
x_temp = linspace(-5,5,numel(y_axis));
figure
plot(x_temp, fliplr(y_axis), 'r');
hold on
plot (x_temp, py_x (x_temp), 'b' )
于 2013-11-03T11:44:54.240 回答
1

尝试这个:

set(gca,'YTick',fliplr([0.9999 0.9995 0.999 0.995 0.99 0.98 0.95 0.9 0.8 0.7 0.5 0.3 0.2 0.1 0.05 0.02 0.01 0.005 0.001 0.0005 0.0001]));
set(gca,'YTickLabel',num2cell(fliplr([0.9999 0.9995 0.999 0.995 0.99 0.98 0.95 0.9 0.8 0.7 0.5 0.3 0.2 0.1 0.05 0.02 0.01 0.005 0.001 0.0005 0.0001])));

Matlab 希望数字按递增顺序排列,因此我没有重新排序您的数字,而是调用fliplr了。

于 2013-11-02T22:05:05.640 回答