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].

スケーリングは対数ではありません。ティック間のスペースが等しくありません。確かに、それは線形ではありません。大きな数字 (0.9... 0.999) と非常に小さな数字 (0.0001... 0.1) を 1 つの y 軸だけで詳細に見ることができます。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が投稿した図では、目盛りはまったく均等に分散されていません。また、軸のスケールはシ​​グモイドのです (以下を参照)。その論文の著者が何をしたかを実際に見るために、図をスケルトン化することができます

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 ティック ラベルy_val(y_axis昇順で反転)をプロットy_pxすると、@chapjc が示唆するように、関係が正確にシグモイドであることを確認できます。ただし、同様のプロットを作成するには、式を逆にして関数を定義することをお勧めします。

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

その後、この関数をプロットに使用できます。あなたが参照している論文は、範囲内のデータを示していますx = -10 : 0.1 : 4。この同じ範囲で、0.0001 から 0.9999 の間の正弦関数をプロットしてみましょう。スケーリング関数を使用しpx_y、y ティックの位置ラベルを置き換えることに注意してください。

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

このように見えるはずです

ここに画像の説明を入力

y_px要約すると、y データを変換する関数を定義してから、軸のytickおよびyticklabelプロパティを設定できます。このアプローチで選択するスケールに関係なく、値とすべての y データの 両方を同じ関数で変換することが重要です。ytick

于 2013-11-03T01:46:30.783 に答える
1

ここに画像の説明を入力これが私が見つけた最終的な解決策です。どうもありがとうございました。シグモイド関数を知りませんでした。以下は、この目的のための MATLAB コードです。

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 に答える
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)))ください。外観は次のとおりです。

ここに画像の説明を入力

フォームは正しく見えます。形状を微調整するための用語の 1 つにおそらく定数があります。このスペースにデータを配置する場合は、この機能 (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 に答える