Plot a cumulative distribution with a symmetric logarithmic scale centred at 50%

4 ビュー (過去 30 日間)
Nikolai B.
Nikolai B. 2022 年 9 月 15 日
編集済み: Nikolai B. 2022 年 9 月 19 日
I have a cumulative distribution for wind speeds. From this graph I have estimated a normal distribution. In order to compare the estimation with the original graph, I would like to create exactly the same kind of graph plotting. The x-axis is mirrored logarithmically at the probability of 50% in the given figure. However, I have not found a way to do this in Matlab. A figure is included to visualize the desired outcome. I already calculated an approximated function:
% Approximated coefficients for cumulative distribution function (CDF)
a1 = 0.1194;
a2 = -0.000102;
mu = 1.5;
% Range of CS-AWO wind speeds in "probability of exceedene plot"
x = linspace(-30,30);
% Calculate values from approximated function of CDF from CS-AWO
for i = 1:length(x)
cdf_app(i) = exp(2*(a1*(x(i)-mu)*(1+a2*(x(i)-mu)^2)))/(1+exp(2*(a1*(x(i)-mu)*(1+a2*(x(i)-mu)^2))));
end
% Plot result
plot(cdf_app*100,x)

採用された回答

Jeff Miller
Jeff Miller 2022 年 9 月 17 日
Not sure if I really understand what you want but maybe something like this:
z_app = norminv(cdf_app); % find the normal Z scores corresponding to each CDF value
plot(z_app,x); % this plot may have the x-axis spacing you want
% Now set the xticks & labels to show the cumulative probabilities at
% various x points. You will want more ticks I am sure.
xticks([-0.25335 0 0.25335]); % the CDFs of these three Z values are 0.40, 0.50, and 0.60, from norminv
xticklabels({'40' '50' '60'})
Is this close to what you have in mind?
  1 件のコメント
Nikolai B.
Nikolai B. 2022 年 9 月 19 日
編集済み: Nikolai B. 2022 年 9 月 19 日
This was a very good answer. Thank you! I finally was able to plot it in Matlab with the help of your Code. Here is the solution:
% Approximated coefficients for cumulative distribution function (CDF)
a1 = 0.1194;
a2 = -0.000102;
mu = 1.5;
% Range of CS-AWO wind speeds in "probability of exceedene plot"
% Set step size very small, so that the next value can be found with "min"
x = linspace(-40,40,5000);
% Calculate values from approximated function of CDF from CS-AWO
for i = 1:length(x)
cdf_app(i) = exp(2*(a1*(x(i)-mu)*(1+a2*(x(i)-mu)^2)))/...
(1+exp(2*(a1*(x(i)-mu)*(1+a2*(x(i)-mu)^2))));
end
% Set wanted Probabilities for x-Axis
ProbX = [0.1,1,10,20,30,40,50,60,70,80,90,99,99.9]/100;
% Calculate normal inverse cumulative distribution function
z_app = norminv(cdf_app);
for i = 1:length(ProbX)
[val,pos] = min(abs(cdf_app-ProbX(i))); % search pos. of probabilities
Approx(i) = x(pos); % Get position of approximation with defined Prob.
z_appPos(i) = z_app(pos); % Get position in inverted Gauss distr.
ProbStr(i) = {num2str(ProbX(i)*100)}; % Make cell array of Xtick str.
end
plot(z_app,x); % Plot inverted normal distribution
xticks(z_appPos); % Set X-Ticks
xticklabels(ProbStr); % Set X-Tick labels
xlabel('Probability of not Exceeding [%]')
ylabel('Wind Speed [kt]')
legend('Approximated Cumulative Distribution')
grid on

サインインしてコメントする。

その他の回答 (0 件)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by