Wykres lokalny MatPlotLib i zdalne dane

Jeśli analizujesz/przetwarzasz/obrabiasz dane w Pythonie pewnie dobrze znasz linijki:

import matplotlib.pyplot as plt
plt.plot(moje_dane)
plt.show()

W skrócie jest to szybki i wygodny sposób na wyświetlenie danych na wykresie (gorąco polecam matplotlib 🙂 ).
Czasem jednak zdarza się, że konieczna jest praca na zdalnym serwerze (specyficzne biblioteki lub sprzęt, dostępny grid albo nasz komputer jest już trochę za słaby).
Okazuje się, że lokalne wyświetlanie wykresów nie jest dostępne wprost lub jest to utrudnione.

Co robić, jak żyć?

W takiej sytuacji można wykorzystać docenić elastyczność Pythona i mnogość gotowych rozwiązań, a w tym wypadku cPickle. Jest biblioteką pozwalającą m.i. na serializację (zapisanie obiektu z pamięci jako string). Tak zapisane dane można bez wygodnie przesłać przez sieć. Łatwiej napisać niż opowiedzieć 😉

Plik plotServer.py

# Import bibliotek
import socket
import sys
import cPickle
import matplotlib.pyplot as plt
# Tworzenie serwera 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('0.0.0.0', 4536)
sock.bind(server_address)
sock.listen(1)
# Glowna petla
while True:
    print >>sys.stderr, 'waiting for a connection'
    # Oczekiwanie na klienta
    connection, client_address = sock.accept()
    try:
        # Odbieranie danych
        l = int(connection.recv(16))
        print >>sys.stderr, 'connection from', client_address, 'reading %d bytes'%l
        data = ''
        while len(data) < l:
            data += connection.recv(l - len(data))
        # Deserializacja
        x = cPickle.loads(data)
        # Rysowanie wykresu
        plt.plot(x)
        plt.show()
    finally:
        connection.close()

Funkcja wysyłająca dane i jej użycie:

# Import bibliotek
import socket, cPickle
# Funkcja zdalnego rysowania
def remotePlot(arr, host='192.168.77.30',port=4536):
    # Laczenie z serwerem
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, port))
    # Serializacja danych
    data_string = cPickle.dumps(arr)
    dataSize = len(data_string)
    # Wysylanie
    s.send("% 16d"%dataSize)
    s.send(data_string)
    s.close()

# Tablica liczb
moja_tablica = [1,2,3,4,3,2,1,2]
# Wyslanie do domyslnego serwera 
remotePlot(moja_tablica)
# Wyslanie do konkretnego serwera 
remotePlot(moja_tablica,'moj_adres.dyndns.com')
Na deser film!
Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInEmail this to someonePrint this page