Skip to content

Commit 57df471

Browse files
author
Onur Rauf Bingol
committed
Add a check to detect if inside the Jupyter notebook
Also fixes showing the figure twice inside the notebook
1 parent 51bfca1 commit 57df471

File tree

1 file changed

+94
-70
lines changed

1 file changed

+94
-70
lines changed

geomdl/visualization/VisMPL.py

Lines changed: 94 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,14 @@ def save_figure_as(fig, filename):
112112
if filename is not None:
113113
fig.savefig(str(filename), bbox_inches='tight')
114114

115+
def is_notebook(self):
116+
""" Detects if Jupyter notebook GUI toolkit is active
117+
118+
return: True if the module is running inside a Jupyter notebook
119+
rtype: bool
120+
"""
121+
return True if "nbAgg" == mpl.get_backend() else False
122+
115123

116124
class VisCurve2D(vis.VisAbstract):
117125
""" Matplotlib visualization module for 2D curves """
@@ -184,14 +192,16 @@ def render(self, **kwargs):
184192
fig_filename = kwargs.get('fig_save_as', None)
185193
fig_display = kwargs.get('display_plot', True)
186194

187-
# Display the plot
188-
if fig_display:
189-
plt.show()
190-
else:
191-
fig_filename = self.vconf.figure_image_filename if fig_filename is None else fig_filename
195+
# Check if running inside a Jupyter notebook
196+
if not self.vconf.is_notebook():
197+
# Display the plot
198+
if fig_display:
199+
plt.show()
200+
else:
201+
fig_filename = self.vconf.figure_image_filename if fig_filename is None else fig_filename
192202

193-
# Save the figure
194-
self.vconf.save_figure_as(fig, fig_filename)
203+
# Save the figure
204+
self.vconf.save_figure_as(fig, fig_filename)
195205

196206

197207
class VisCurve3D(vis.VisAbstract):
@@ -271,17 +281,19 @@ def render(self, **kwargs):
271281
fig_filename = kwargs.get('fig_save_as', None)
272282
fig_display = kwargs.get('display_plot', True)
273283

274-
# Display the plot
275-
if fig_display:
276-
plt.show()
277-
else:
278-
fig_filename = self.vconf.figure_image_filename if fig_filename is None else fig_filename
284+
# Check if running inside a Jupyter notebook
285+
if not self.vconf.is_notebook():
286+
# Display the plot
287+
if fig_display:
288+
plt.show()
289+
else:
290+
fig_filename = self.vconf.figure_image_filename if fig_filename is None else fig_filename
279291

280-
# Save the figure
281-
self.vconf.save_figure_as(fig, fig_filename)
292+
# Save the figure
293+
self.vconf.save_figure_as(fig, fig_filename)
282294

283-
# Return the figure object
284-
return fig
295+
# Return the figure object
296+
return fig
285297

286298

287299
class VisSurface(vis.VisAbstract):
@@ -389,17 +401,19 @@ def animate(self, **kwargs):
389401
fig_filename = kwargs.get('fig_save_as', None)
390402
fig_display = kwargs.get('display_plot', True)
391403

392-
# Display the plot
393-
if fig_display:
394-
plt.show()
395-
else:
396-
fig_filename = self.vconf.figure_image_filename if fig_filename is None else fig_filename
404+
# Check if running inside a Jupyter notebook
405+
if not self.vconf.is_notebook():
406+
# Display the plot
407+
if fig_display:
408+
plt.show()
409+
else:
410+
fig_filename = self.vconf.figure_image_filename if fig_filename is None else fig_filename
397411

398-
# Save the figure
399-
self.vconf.save_figure_as(fig, fig_filename)
412+
# Save the figure
413+
self.vconf.save_figure_as(fig, fig_filename)
400414

401-
# Return the figure object
402-
return fig
415+
# Return the figure object
416+
return fig
403417

404418
def render(self, **kwargs):
405419
""" Plots the surface and the control points grid.
@@ -528,17 +542,19 @@ def render(self, **kwargs):
528542
fig_filename = kwargs.get('fig_save_as', None)
529543
fig_display = kwargs.get('display_plot', True)
530544

531-
# Display the plot
532-
if fig_display:
533-
plt.show()
534-
else:
535-
fig_filename = self.vconf.figure_image_filename if fig_filename is None else fig_filename
545+
# Check if running inside a Jupyter notebook
546+
if not self.vconf.is_notebook():
547+
# Display the plot
548+
if fig_display:
549+
plt.show()
550+
else:
551+
fig_filename = self.vconf.figure_image_filename if fig_filename is None else fig_filename
536552

537-
# Save the figure
538-
self.vconf.save_figure_as(fig, fig_filename)
553+
# Save the figure
554+
self.vconf.save_figure_as(fig, fig_filename)
539555

540-
# Return the figure object
541-
return fig
556+
# Return the figure object
557+
return fig
542558

543559

544560
# VisSurfTriangle is an alias for VisSurface class
@@ -644,17 +660,19 @@ def render(self, **kwargs):
644660
fig_filename = kwargs.get('fig_save_as', None)
645661
fig_display = kwargs.get('display_plot', True)
646662

647-
# Display the plot
648-
if fig_display:
649-
plt.show()
650-
else:
651-
fig_filename = self.vconf.figure_image_filename if fig_filename is None else fig_filename
663+
# Check if running inside a Jupyter notebook
664+
if not self.vconf.is_notebook():
665+
# Display the plot
666+
if fig_display:
667+
plt.show()
668+
else:
669+
fig_filename = self.vconf.figure_image_filename if fig_filename is None else fig_filename
652670

653-
# Save the figure
654-
self.vconf.save_figure_as(fig, fig_filename)
671+
# Save the figure
672+
self.vconf.save_figure_as(fig, fig_filename)
655673

656-
# Return the figure object
657-
return fig
674+
# Return the figure object
675+
return fig
658676

659677

660678
class VisSurfScatter(vis.VisAbstract):
@@ -757,17 +775,19 @@ def render(self, **kwargs):
757775
fig_filename = kwargs.get('fig_save_as', None)
758776
fig_display = kwargs.get('display_plot', True)
759777

760-
# Display the plot
761-
if fig_display:
762-
plt.show()
763-
else:
764-
fig_filename = self.vconf.figure_image_filename if fig_filename is None else fig_filename
778+
# Check if running inside a Jupyter notebook
779+
if not self.vconf.is_notebook():
780+
# Display the plot
781+
if fig_display:
782+
plt.show()
783+
else:
784+
fig_filename = self.vconf.figure_image_filename if fig_filename is None else fig_filename
765785

766-
# Save the figure
767-
self.vconf.save_figure_as(fig, fig_filename)
786+
# Save the figure
787+
self.vconf.save_figure_as(fig, fig_filename)
768788

769-
# Return the figure object
770-
return fig
789+
# Return the figure object
790+
return fig
771791

772792

773793
class VisVolume(vis.VisAbstract):
@@ -845,17 +865,19 @@ def render(self, **kwargs):
845865
fig_filename = kwargs.get('fig_save_as', None)
846866
fig_display = kwargs.get('display_plot', True)
847867

848-
# Display the plot
849-
if fig_display:
850-
plt.show()
851-
else:
852-
fig_filename = self.vconf.figure_image_filename if fig_filename is None else fig_filename
868+
# Check if running inside a Jupyter notebook
869+
if not self.vconf.is_notebook():
870+
# Display the plot
871+
if fig_display:
872+
plt.show()
873+
else:
874+
fig_filename = self.vconf.figure_image_filename if fig_filename is None else fig_filename
853875

854-
# Save the figure
855-
self.vconf.save_figure_as(fig, fig_filename)
876+
# Save the figure
877+
self.vconf.save_figure_as(fig, fig_filename)
856878

857-
# Return the figure object
858-
return fig
879+
# Return the figure object
880+
return fig
859881

860882

861883
class VisVoxel(vis.VisAbstract):
@@ -945,14 +967,16 @@ def render(self, **kwargs):
945967
fig_filename = kwargs.get('fig_save_as', None)
946968
fig_display = kwargs.get('display_plot', True)
947969

948-
# Display the plot
949-
if fig_display:
950-
plt.show()
951-
else:
952-
fig_filename = self.vconf.figure_image_filename if fig_filename is None else fig_filename
970+
# Check if running inside a Jupyter notebook
971+
if not self.vconf.is_notebook():
972+
# Display the plot
973+
if fig_display:
974+
plt.show()
975+
else:
976+
fig_filename = self.vconf.figure_image_filename if fig_filename is None else fig_filename
953977

954-
# Save the figure
955-
self.vconf.save_figure_as(fig, fig_filename)
978+
# Save the figure
979+
self.vconf.save_figure_as(fig, fig_filename)
956980

957-
# Return the figure object
958-
return fig
981+
# Return the figure object
982+
return fig

0 commit comments

Comments
 (0)