AllgemeinBlogLinuxMatplotlibPython

matplotlib über putty ssh

Ich habe mich vor ein paar Wochen in ein edx Kurse für Data Scientist eingeschrieben und diesen erfolgreich mit einem Zertifikat bestanden. Die zu verwendete Shell hat damals DataCamp bereitgestellt. IPython kam hierbei zum Einsatz. In dem Kurs habe ich erstes Grundwissen über numpy, matplotlib und Pandas erworben. Dieses Wissen wollte ich nun an meinem vServer anwenden. Dafür habe ich zuerst matplotlib für Python3 installiert.

apt install python3-matplotlib

Zum Testen habe ich das Script von unten(Testbeispiel) benutzt. Führt man das Script direkt aus, sollte folgende Fehlermeldung kommen.

/usr/lib/python3/dist-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.
  warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')
/usr/lib/python3/dist-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.
  warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')
Traceback (most recent call last):
  File "test.py", line 6, in <module>
    plt.plot(x, x, label='linear')
  File "/usr/lib/python3/dist-packages/matplotlib/pyplot.py", line 3147, in plot
    ax = gca()
  File "/usr/lib/python3/dist-packages/matplotlib/pyplot.py", line 928, in gca
    return gcf().gca(**kwargs)
  File "/usr/lib/python3/dist-packages/matplotlib/pyplot.py", line 578, in gcf
    return figure()
  File "/usr/lib/python3/dist-packages/matplotlib/pyplot.py", line 527, in figure
    **kwargs)
  File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_tkagg.py", line 84, in new_figure_manager
    return new_figure_manager_given_figure(num, figure)
  File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_tkagg.py", line 92, in new_figure_manager_given_figure
    window = Tk.Tk()
  File "/usr/lib/python3.5/tkinter/__init__.py", line 1871, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable

Der Fehler besagt, dass kein „Display“ gefunden wird, in dem der Graph angezeigt werden kann.
Wir rufen das Script ja schließlich über die Shell auf. Es fehlt dementsprechend ein xServer, der den Output zu einem Client tunnelt. Dazu sind ein paar Anpassungen auf dem Server als auch am Client notwendig.

Server-Seite

Auf dem Server muss unter anderem das xauth Paket installiert werden.

apt install xauth

Neben dem Paket ist auch eine Änderung an der sshd_config notwendig, damit ssh den eigentlichen Output auch weiterleitet. Dazu fügt die 2 Parameter hinzu oder ändert sie ab.

vi /etc/ssh/sshd_config

X11Forwarding yes
X11DisplayOffset 10

 

Client-Seite

Auf der Client Seite sollte ein xServer installiert sein. Sehr beliebt ist hier Xming. Xming ist hier zu bekommen.

Die Installation ist schnell und einfach. Nach ein paar Einstellungen die zu treffen sind, ist der xServer auch schnell installiert.

 

 

 

 

 

Auf der Putty Shell im Client muss der X11 noch aktiviert werden. Dazu tickt den „Enable X11 forwarding“ an.

 

TestBeispiel

Hier das Testbeispiel, welches ich benutzt habe, um den xServer zu testen. Das Scipt habe ich dabei von hier: https://matplotlib.org/3.1.1/tutorials/introductory/usage.html#sphx-glr-tutorials-introductory-usage-py

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2, 100)

plt.plot(x, x, label='linear')
plt.plot(x, x**2, label='quadratic')
plt.plot(x, x**3, label='cubic')

plt.xlabel('x label')
plt.ylabel('y label')

plt.title("Simple Plot")

plt.legend()

plt.show()

 

Ist der xServer auf dem Client installiert und gestartet, sollte der Graphic Output nun lokal auf dem Rechner zu sehen sein, auf dem der Command ausgeführt wurde.

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.