Reputation: 511
I was trying to run a simulation (written in python) in the central server, and when simulation is finished, move saved figure file / saved data file to my local PC, by connecting to my local PC. Code is as following:
import matplotlib.pyplot as plt
import subprocess
import scipy.io
import os
#Save data file:
scipy.io.savemat(data_path + Filename_str, dict(A=board))
#Create / Save figure by using imshow (Heatmap)
p = plt.imshow(mean_map.T, cmap = plt.cm.gist_yarg_r, origin = 'lower', extent = [0, phi, 0, Z], aspect='auto')
plt.savefig(figure_path + Filename_str + '-Homophily.pdf')
# Connect to my local host (arabian-knights) using ssh, and follow command.
ret = subprocess.call(['ssh', 'arabian-knights', 'mv Data/* /scratch/Data/'])
ret = subprocess.call(['ssh', 'arabian-knights', 'mv Figure/* /scratch/Figure/'])
I run this simulation in background of server computer, after connecting to server computer from my local computer (arabian-knights). Even though I turn off connection to server computer, as simulation is running in background, it doesn't stop, and Data files are correctly moved to my local computer after simulation is done. However, Figure files (produced by matplotlib.pyplot.imshow) are not saved, showing following error messsage:
Traceback (most recent call last):
File "./ThrHomoHeatmap-thrstep.py", line 179, in <module>
p = plt.imshow(board.T, cmap = plt.cm.gist_yarg_r, vmin=0, vmax=n, origin = 'lower', extent = [0, phi, 0, Z], aspect='auto')
File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 2370, in imshow
ax = gca()
File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 701, in gca
ax = gcf().gca(**kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 369, in gcf
return figure()
File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 343, in figure
**kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 80, in new_figure_manager
window = Tk.Tk()
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1688, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: couldn't connect to display "localhost:18.0"
Is there anyone who can solve this problem, to move matplotlib.pyplot figure files from server to local computer as well?
Upvotes: 39
Views: 45750
Reputation: 87356
The problem is that you are using an interactive backend which is trying to create figure windows for you, which are failing because you have disconnected the x-server that was available when you started the simulations.
Change your imports to
import matplotlib
matplotlib.use('pdf')
import matplotlib.pyplot as plt
Upvotes: 40
Reputation: 10366
Generate images without having a window appear (background)
use a non-interactive backend (see What is a backend?) such as Agg
(for PNG
s), PDF
, SVG
or PS
. In your figure-generating script, just call the matplotlib.use()
directive before importing pylab
or pyplot
:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.savefig('myfig')
Note: This answer was in short mentioned in a comment. I put it here as an answer to increase visibility since it helped me and I was lucky enough that I decided to read the comments.
Upvotes: 30