Azzera filtri
Azzera filtri

Why are my graphs closing when I use the matlab api?

8 visualizzazioni (ultimi 30 giorni)
I'm having an issue where I run this code in my matlab python api and the graph closes right after all the assets load onto the graph and can't seem to figure out why, I'll leave an example I found that does exactly what i was saying. Any help would be very much appreciated.
import matlab.engine
eng = matlab.engine.start_matlab()
eng.eval("T = readtable('patients.dat');",nargout=0)
eng.eval("S = table2struct(T,'ToScalar',true);",nargout=0)
eng.eval("disp(S)",nargout=0)
D = eng.workspace["S"]
smoker = matlab.logical(D["Smoker"])
pressure = D["Diastolic"]
pressure.reshape((1,100))
pressure = pressure[0]
smoker.reshape((1,100))
smoker = smoker[0]
sp = [p for (p,s) in zip(pressure,smoker) if s is True]
nsp = [p for (p,s) in zip(pressure,smoker) if s is False]
print(len(sp))
print(len(nsp))
sp = matlab.double(sp)
nsp = matlab.double(nsp)
print(eng.mean(sp))
print(eng.mean(nsp))
sdx = eng.linspace(1.0,34.0,34)
nsdx = eng.linspace(1.0,34.0,66)
eng.figure(nargout=0)
eng.hold("on",nargout=0)
eng.box("on",nargout=0)
eng.scatter(sdx,sp,10,'blue')
h = eng.scatter(nsdx,nsp,10,'red')
h = eng.xlabel("Patient (Anonymized)")
h = eng.ylabel("Diastolic Blood Pressure (mm Hg)")
h = eng.title("Blood Pressure Readings for All Patients")
h = eng.legend("Smokers","Nonsmokers")
x = matlab.double([0,35])
y = matlab.double([89.9,89.9])
h = eng.line(x,y,"Color","blue")
h = eng.text(21.0,88.5,"89.9 (Smoker avg.)","Color","blue")
y = matlab.double([79.4,79.4])
h = eng.line(x,y,"Color","red")
h = eng.text(5.0,81.0,"79.4 (Nonsmoker avg.)","Color","red")code

Risposte (1)

Robert Snoeberger
Robert Snoeberger il 22 Giu 2017
My guess is that MATLAB is exiting when your script finishes. Since you are starting a new MATLAB session, the lifetime of MATLAB is tied to the lifetime of the variable 'eng'. You could consider using a shared MATLAB [1].
  2 Commenti
Robert Snoeberger
Robert Snoeberger il 22 Giu 2017
You could also add some code at the end of your script to make Python wait for the figure to be closed. One way might be to loop while the figure handle is valid:
while eng.isvalid(h):
pass
isvalid(h) will return False when the figure is closed.
Tianya Duan
Tianya Duan il 25 Mar 2020
Thank you for your answer, help me a lot.

Accedi per commentare.

Categorie

Scopri di più su Graphics Object Programming in Help Center e File Exchange

Tag

Community Treasure Hunt

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

Start Hunting!

Translated by