How can I extract data from the following Matlab figure, there are multiple lines.

9 ビュー (過去 30 日間)
AVINASH SAHU
AVINASH SAHU 2022 年 7 月 12 日
回答済み: Steven Lord 2022 年 7 月 12 日
alpha = -0.1;
sigma = 0.1;
eps = -0.1;
e = 0.2;
M = 4;
a = 2;
psi_list = [10, 20, 30, 40, 50];
lambda = 0:0.2:4;
for i = 1:numel(psi_list)
psi = psi_list(i);
hbar = @(x) a - a.*x + x;
A1 = eps + alpha^3 + (3 * sigma^2 * alpha);
B1 =@(x,lambda) (-3 * lambda * M) * ((hbar(x).^2) + (2 .* hbar(x) .* alpha) + (sigma^2) + (alpha^2));
a1 =@(x) tanh(M .* hbar(x));
b1 =@(x) 1 - ((tanh(M .* hbar(x))).^2);
c1 = (M * alpha) - ((M^3 * A1)/3);
d1 = @(lambda) 2 * (M^2) * (1 + lambda);
C1=@(x) a1(x) + (b1(x) .* c1);
D1 =@(x,lambda) d1(lambda) .* ((hbar(x).^3) + (3 .* (hbar(x).^2) .* alpha) + (3 .* hbar(x) .* (alpha)^2) + (3 .* hbar(x) .* (sigma)^2) + eps + (3 * alpha * (sigma^2)) + (alpha^3));
f1 =@(x,lambda) B1(x,lambda) + (3 * lambda .* C1(x) .* hbar(x)) + (3 * lambda .* C1(x) .* alpha) + (D1(x,lambda) .* C1(x));
f2 =@(x,lambda) 12 * (M^2) * (1 + lambda) .* C1(x);
f3 = psi * (e^3);
f4 = @(lambda) (1 + lambda) *180 * ((1 - e)^2);
f5 =@(lambda) 1./(2 + lambda);
F = @(x,lambda) ((f5(lambda) .* f1(x,lambda))./f2(x,lambda)) + (f3./f4(lambda));
q1 =@(x,lambda) hbar(x) ./ (2 .* F(x,lambda));
Q1 = @(lambda)integral(@(x)q1(x,lambda),0,1,'ArrayValued',true); % integration with respect to "x" limit 0 to 1
q2 = @(x,lambda) 1./(F(x,lambda));
Q2 = @(lambda)integral(@(x)q2(x,lambda),0,1,'ArrayValued',true); % integration with respect to "x" limit 0 to 1
Q = @(lambda) Q1(lambda)./Q2(lambda); % Q is a function of "lambda"
A2 = eps + alpha^3 + (3 * sigma* alpha^2 );
c2 = (M * alpha) - ((M^3 * A2)/3);
C2=@(x) a1(x) + (b1(x) .* c2);
dP = @(x,lambda) ((0.5 .* hbar(x)) - Q(lambda)) ./ F(x,lambda);
k1 = @(x,lambda) ((hbar(x) + alpha)./2) .* dP(x,lambda);
k2 = @(lambda) M .* (1 + lambda) .* (2 + lambda);
k3 = @(x,lambda) 4 * M .* hbar(x) .* (hbar(x) + alpha) .* (1 + lambda) + (lambda .* C2(x));
fri = @(x, lambda) k1(x,lambda) + ((k2(lambda)) ./ k3(x,lambda));
Fri =@(lambda) integral(@(x)fri(x,lambda),0,1,'ArrayValued',true);
plot(lambda,Fri(lambda))
hold on
end
legend(num2str(psi_list'))
ylim([0 1])
xlim([0 4])
set(gca, 'ytick', 0:0.1:1);
set(gca, 'xtick', 0:0.2:4);
xlabel('lambda')
ylabel('Fri(lambda)')

I have tried the following code but this is not working.

open('example.fig');
a = get(gca,'Children');
xdata = get(a, 'XData');
ydata = get(a, 'YData');

採用された回答

dpb
dpb 2022 年 7 月 12 日
編集済み: dpb 2022 年 7 月 12 日
Already you have them in
plot(lambda,Fri(lambda))
if you'll just save
...
y(:,i)=Fri(lambda);
hL(i)=plot(lambda,y(:,i));
"x" is lambda and is fixed all elements.
With the above in the loop (preallocate 'y' before the loop for efficiency, of course), then you could move
plot(lambda,Fri(lambda))
hold on
out of the loop and instead
hL=plot(lambda,y);
...
using the vectorized operations of plot to treat each column of an array as a separate variable.

その他の回答 (2 件)

KSSV
KSSV 2022 年 7 月 12 日
Already you have them in xdata and ydata.
They are cell arrays, you can access them by:
xdata{1}
xdata{2}
ydata{1}
ydata{2}

Steven Lord
Steven Lord 2022 年 7 月 12 日
One easy way to do this is to store the handles to the lines as you plot them. Before your loop preallocate an array to hold the handles:
psi_list = [10, 20, 30, 40, 50];
h = gobjects(size(psi_list));
Inside the loop, assign the output of plot into h(i). You may also want to set its DisplayName property, which would simplify your legend call to just legend show.
h(i) = plot(lambda,Fri(lambda), 'DisplayName', string(psi));
% later
legend show % Use the DisplayName properties of the lines
Then when you want to retrieve the data from one of the lines, for example line 2:
xx = h(2).XData;
yy = h(2).YData;

カテゴリ

Help Center および File ExchangeAnnotations についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by