web-dev-qa-db-ja.com

pylabでフィギュアをリモートで保存する方法は?

コマンドpylab.savefigを使用して、リモートコンピューターで図を生成しようとしています。しかし、私はそのようなエラーを得ました:

Unable to access the X Display, is $DISPLAY set properly?

図を適切に保存するにはどうすればよいですか?

71
gerry

デフォルトでは、matplotlibはTkAggバックエンドのようなものを使用します。これを実行するには、Xサーバーが必要です。

Xフォワーディングだけを使用できますが、matplotlibがリモートXサーバーに接続しようとすると、顕著な遅延が発生します。プロットを操作する必要がない場合、X接続を完全に回避することで速度を上げる方が良い場合がよくあります。

Xサーバーをまったく必要とせずにプロットしたい場合は、代わりにAggbackend を使用してください。

例えば。このようなことをしてください:

import matplotlib
matplotlib.use('Agg') # Must be before importing matplotlib.pyplot or pylab!
import matplotlib.pyplot as plt

fig = plt.figure()
plt.plot(range(10))
fig.savefig('temp.png')

これをデフォルトの動作にしたい場合は、デフォルトでAggバックエンドを使用するように matplotlibrcファイル を変更できます。

詳細はこの記事 を参照してください。

139
Joe Kington

うーん、DISPLAY変数を適切に設定しますか?

X11を使用したネットワーク上のグラフィックスは、グラフィックスを描画する場所を示すDISPLAY環境変数を持つクライアント(リモート)コンピューターによって機能します。通常、mydesktop.example.com:0.0のようなものになります。X11プログラムが何かを描画しようとすると、ネットワークを介してmydesktop.example.comに移動します。mydesktop.example.comは、Xサーバー)とそれがポップアップします。

さて、目の前のマシンがWindowsである場合、どこかからXサーバーを取得する必要があります-cygwin/X11または商用eXceedがうまく機能します。

また、セキュリティが処理されていることを確認する必要があります。ネットワーク経由で画面に誰かが書き込むことはできません。

リモートマシンにどのように接続していますか?なぜなら、sshを使用してLinuxボックスから別のLinuxボックスに移動する場合、単純な解決策はおそらく「Use ssh -X foo.example.com」であり、これはローカルソケットを介してX11接続をパイプするからです。

それで、ssh -Xが答えではない場合、関連するオペレーティングシステムに関する詳細情報を入手できますか?

1
Spacedman