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

11 views (last 30 days)
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)

Accepted Answer

Jeff Miller
Jeff Miller on 17 Sep 2022
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 Comment
Nikolai B.
Nikolai B. on 19 Sep 2022
Edited: Nikolai B. on 19 Sep 2022
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

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!