PyX jest pakietem Pythona do grafiki wektorowej. Pozawala zatem tworzyd pliki EPS oraz PDF. Aby go zainstalowad należy rozpakowad pakiet o nazwie PyX-0.10 do odpowiedniego katalogu. Będzie on dostępny pod adresem: http://zsi.tech.us.edu.pl/~nowak/python/pyx-0.10.rar Jeśli zostanie on zapisany w katalogu D:\Program Files (x86)\pyx-0.10\ to uruchamiamy konsolę (linię poleceo CMD) i wpisujemy następującą komendę: pyton setup.py install jak na rysunku poniżej: Użytkownik może zatem zapisad w kodzie Pythona nawet najbardziej skomplikowaną grafikę. W ramach pakietu mamy kilka modułów: canvas, path, deco, style, color, connector Text, box Trafo, unit graph (wliczając submodules)i graph.axis (wliczając submodules) epsfile Podstawowa grafika Formaty wyjściowe Tex/LaTex Transformacja liniowa Grafy, wykresy Pliki EPS Wszystkie te moduły zaimportujemy jedną linią kodu: from pyx import * Moduł path pozwala tworzyd postskryptowe ścieżki, które są blokami zawierającymi grafikę: linie proste, kąty, figury, krzywe. Takie elementy (path) nie są ze sobą połączone, nazywamy je podścieżkami (subpaths). Ścieżki tworzymy używając metod: moveto, lineto, curveto. Przykład 1: Tworzymy ścieżkę o która jest linią prostą od punktu (0,0) do (1,1) from pyx import * p=path.path(path.moveto(0,0),path.lineto(1,1)) Ostatnia linia będzie równoważną do linii: p=path.line(0,0,1,1) Póki nie użyjemy instrukcji która by tę grafikę gdzieś zapisała nie zobaczymy efektu wykonania powyższego kodu.
Efekt wyrysowania stworzonych elementów będzie widoczny dopiero gdy użyjemy elementu typu Canvas (płótno). c=canvas.canvas() Do niego trzeba załadowad elementy typu path. c.stroke(p) p.writeepsfile("line") # to spowoduje zapisanie efektu do pliku lines.eps p.writepdffile("line")# to spowoduje zapisanie efektu do pliku lines.pdf Kod: Będzie miał efekt następujący: Przykład 2: Załóżmy, że chcemy stworzyd grafikę złożoną z kilku elementów (subpaths): cross=path.path(path.moveto(0,0),path.rlineto(1,1),path.moveto(1,0), path.rlineto(-1,1))
a) 4 oddzielne linie b) Jedna otwarta ścieżka c) Jedna zamknięta ścieżka d) Wypełniona scieżka (zamykana zawsze). Pierwszy element (a) jest stworzony przy użyciu linii od punktu (0,0) do (1,1) ale z użyciem metody rlineto. Uwaga! ważna zasada jest taka, że każdorazowo metoda moveto zaczyna nowy element grafiki, zatem jeśli chcemy narysowad kwadrat nie powinniśmy użyd do tego następującego kodu: rect1=path.path(path.moveto(0,0),path.lineto(0,1), path.moveto(0,1),path.lineto(1,1), path.moveto(1,1),path.lineto(1,0), path.moveto(1,0),path.lineto(0,0)) ponieważ to stworzy 4 odrębne linie, i nie będzie możliwe wypełnienie tej figury. By to było możliwe lepiej użyd następującego kodu: rect2=path.path(path.moveto(0,0),path.lineto(0,1), path.lineto(1,1),path.lineto(1,0), path.lineto(0,0)) Ale uważny widz zauważy, że taki kwadrat jest nadal figurą w której w jednym rogu jest ona niedomknięta. Zatem najwłaściwszym będzie użycie kodu: rect3=path.path(path.moveto(0,0),path.lineto(0,1), path.lineto(1,1),path.lineto(1,0), path.closepath()) Dyrektywa closepath dodaje linie proste z bieżącego punktu do pierwszego punktu i następne zamyka całą ścieżkę. To odpowiada rysunkowi (c). Wypełnienie ścieżki będzie możliwe dopiero po użyciu następnego kodu: c.stroke(rect2,[deco.filled([color.grey(0.95)])]) Zmiana kolorów będzie możliwa dzięki komendzie: c.stroke(path,[deco.filled([color.rgb.green])]) Kod: Ma efekt następujący:
Warto wspomnied także i to, że do rysowania kwadratów można użyd wprost odpowiedniej do tego komendy: rect2=path.rect(0,0,1,1) zamiast rysowad 4 linie i je łączyd. Przykład 3 Kod: Da efekt: Zaś kod: Efekt następujący:
W ramach zajęd słuchacz powinien zaznajomid się z następującymi klasami: class line(x0,y0,x1,y1) [linia prosta z punktu (x0, y0) do punktu (x1, y1)]. class curve(x0,y0,x1,y1,x2,y2,x3,y3) [krzywa Beziera z punktami kontrolnymi od (x0, y0) do (x3, y3)]. class rect(x,y,w,h) *kwadrat zamknięty od lewego punktu (x, y), szerokości (w) i wysokości (h)+ class circle(x,y,r) *okrąd o środku w punkcie (x, y) i promieniu (r)+. Klasa CANVAS pozwala na użycie następujących jej właściwości (metod): class canvas(attrs=[],texrunner=none) tworzy obiekt CANVAS z atrybutami podanymi jako [attrs], który może byd instancją [trafo.trafo],[canvas.clip],[ style.strokestyle] lub [style.fillstyle]. Argument [texrunner+ może byd użyty do specyfikacji tekstu metodą *text()+ domyślnie nie jest określony. Inne metody: draw(path,attrs) [rysuje elementy path z atrybutami] fill(path,attrs=[]) *wypełnia obiekt path+ stroke(path,attrs=[]) [przecina element path na obiekcie canvas] insert(item,attrs=[]) *wstawia określoną instancję canvasitem do obiektu canvas]. Przy określonych argumentach attr item jest wstawiany jako nowa instancja canvas. text(x,y,text,attrs=[]) [tekst] [wstawia tekst na pozycji (x,y)] insert(texrunner.text(x,y,text,attrs))) skrótowa wersja. bbox() *zwraca obiekt będący zamknięciem wszystkich elementów obiektu canvas+. writeepsfile(file,*args,**kwargs) writepsfile(file,*args,**kwargs) writepdffile(file,*args,**kwargs) writetofile(filename,*args,**kwargs) Grafika (wykresy) i Moduł graph Przykład 1 Przypuśdmy, że mamy następujące dane zapisane w pliku dane.dat :
Chcemy użyd tych danych by wyrysowad je na wykresie: Efekt będzie następujący: Klasa graphxy oraz graphxyz są częścią modułu graph.graph. Są właściwie skrótami klasy graphxy(xpos=0,ypos=0,width=none,height=none,ratio=goldenmean,key =None,background attrs=none,axesdist=0.8*unit.v_cm,xaxisat=none,yaxisat=none,**axe s) Pozycję wykresu określają wartości: xpos oraz ypos. Rozmiar wykresy określają parametry: width, height, oraz ratio. backgroundattrs jest listą atrybutów tworzących tło wykresu.,pozwala na dekoratory typu: strokestyles oraz fillstyles}. axisdist jest odległością między osiami wykresu. Xaxisat, yaxisat określa wartości na osiach X i Y. Przykład 2: Program na pierwiastki równania kwadratowego: Kod następujący:
Jeśli wykonanie przebiegnie wg następującego scenariusza: To efekt będzie następujący:
Przykład 2: Rysujemy histogramy Dane są zapisane w pliku o nazwie minimal.dat i zawiera minimalne i maksymalne temperatury w poszczególnych miesiącach: Po wykonaniu kodu: Efekt będzie następujący: Zaś kod następujący:
Wywoła efekt taki: