Seite 1 von 1

sequence logo mit matplotlib

Verfasst: Sonntag 27. Januar 2013, 12:45
von Eugenie
Hallo,

http://www.nature.com/nmeth/journal/v6/ ... 247-F3.jpg

ich kenne mich nur rudimentär mit matplotlib aus und habe spontan nichts gefunden, aber vielleicht kann mir von euch jemand helfen. Ich würde gern einen plot wie oben verlinkt erstellen, d.h. spaltenweise Buchstaben in verschiedenen Größen darstellen. Weiß jemand, ob man sich das mit matplotlib zusammenbasteln kann?

Vielen Dank schonmal.

Re: sequence logo mit matplotlib

Verfasst: Sonntag 27. Januar 2013, 14:24
von schaeffkoch

Re: sequence logo mit matplotlib

Verfasst: Sonntag 27. Januar 2013, 14:27
von Eugenie
Hab ich schon gelesen, danke.
Das Problem ist, dass ich zwar Buchstaben an beliebiger Stelle plotten kann, aber ich kann sie nicht "verzerren", also z.B. die Breite festsetzen bei varierender Höhe. Mit den fontsize Einstellungen ändert sich immer beides gleichzeitig.

Re: sequence logo mit matplotlib

Verfasst: Sonntag 27. Januar 2013, 16:57
von Sirius3
Hallo Eugenie,

um Text zu verändern, brauchst Du PathEffects. Leider gibt es nichts vorgefertigtes,
sondern Du mußt Dir selbst eine Klasse schreiben:

Code: Alles auswählen

import matplotlib.pyplot as plt
import matplotlib.patheffects

class Scale(matplotlib.patheffects._Base):
    def __init__(self, sx, sy=None):
        self._sx = sx
        self._sy = sy
        
    def draw_path(self, renderer, gc, tpath, affine, rgbFace):
        affine=affine.identity().scale(self._sx, self._sy)+affine
        renderer.draw_path(gc, tpath, affine, rgbFace)

plt.figure()
txt = plt.text(0, 0, "T", fontsize=64,color='red')
txt.set_path_effects([Scale(1,5)])
txt = plt.text(0.1, 0, "G", fontsize=64,color='green')
txt.set_path_effects([Scale(1,3)])
txt = plt.text(0.2, 0, "B", fontsize=64,color='blue')
txt.set_path_effects([Scale(1,7)])
plt.show()
Grüße
Sirius

Re: sequence logo mit matplotlib

Verfasst: Sonntag 27. Januar 2013, 21:10
von Eugenie
Danke Sirius3, leider war dein Code noch etwas ungeeignet, da ich alles pixelgenau berechnen musste (oder ich hab irgendwas falsch verstanden an deinem Code). Jedenfalls hab ich das mittlerweile mit Tkinter und canvas sehr gut hingekriegt, siehe Bild :)
Trotzdem vielen Dank für eure Mühe.

http://img21.imageshack.us/img21/7977/lib03.png