ZeroDivisionError matplotlib, zu kleiner float Zahl

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Hallo Leute,
ich stoße gerade auf ein Problem bei matplotlib. Ich will einen Pfeil zu einem Punkt zeichnen und dazu ein Textfeld erstellen, das soll ein klein wenig versetzt sein, damit der Pfeil nicht senkrecht auf das Ziel zeigt. Um die Koordinaten zu bestimmen frage ich die Position des Punkts ab. Dieser scheint aber "zu genau" für die Textfeld Positionierung zu sein und ich frage mich, wie man eine float mit weniger Nachstellen umwandelt. Hier mal ein Beispiel:

Code: Alles auswählen

ax.annotate(u'%.2f \u00c5 1/2bit'%(1/result_halfbit[0]), xy=result_halfbit, xycoords='data',
        xytext=(0.15141143015791145,0.8), textcoords='data', arrowprops=dict(facecolor='black',     
            shrink=0.02, width=2, headwidth=8), horizontalalignment='left', verticalalignment='top')
Bei xytest habe ich die Koordinate mal direkt eingegeben und nicht aus dem tuple übernommen, wie ich es eigentlich mache. Interessant ist, wenn ich die letzten beiden Stellen, also die 45 weg lasse, funktioniert es.

Ich würde am liebsten nur 0.15 da stehen haben, aber das muss ja dynamisch sein...

Hat jemand eine Idee?
Zuletzt geändert von würmchen am Mittwoch 17. November 2010, 11:28, insgesamt 1-mal geändert.
BlackJack

@würmchen: Ich habe das Problem nicht verstanden. Ich glaube auch nicht, dass es die "Genauigkeit" ist, die da Probleme bereitet. Kann es nicht sein, dass ``result_halfbit[0]`` einfach *wirklich* 0 ist? Falls das der Fall ist, kannst Du das doch einfach abfragen und einen etwas grösseren Wert verwenden. Oder grundsätzlich einen kleinen Versatz addieren, falls das akzeptabel ist.
Benutzeravatar
sparrow
User
Beiträge: 4245
Registriert: Freitag 17. April 2009, 10:28

Code: Alles auswählen

>>> a = 0.15141143015791145
>>> round(a, 2)
0.14999999999999999
>>> b = 2.1
>>> round(b, 2)
2.1000000000000001

Hilft dir das?
Da kommen, je nach System, auch mal runde Zahlen raus ;)
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

@BlackJack
ich hatte es genau mit der Zahl versucht und es geht nicht. Lass ich wie gesagt die letzten beiden Stellen weg, funktioniert es wieder. Ich hab mir auch den Wert aus dem Tuple ausgeben lassen, da hab ich diese Zahl auch her.
Der Fehler der kommt ist folgender:

Code: Alles auswählen

Traceback (most recent call last):
  File "/usr/lib/python2.5/site-packages/matplotlib/backends/backend_gtk.py", line 331, in expose_event
    self._render_figure(self._pixmap, w, h)
  File "/usr/lib/python2.5/site-packages/matplotlib/backends/backend_gtkagg.py", line 75, in _render_figure
    FigureCanvasAgg.draw(self)
  File "/usr/lib/python2.5/site-packages/matplotlib/backends/backend_agg.py", line 256, in draw
    self.figure.draw(self.renderer)
  File "/usr/lib/python2.5/site-packages/matplotlib/figure.py", line 832, in draw
    for a in self.axes: a.draw(renderer)
  File "/usr/lib/python2.5/site-packages/matplotlib/axes.py", line 1482, in draw
    a.draw(renderer)
  File "/usr/lib/python2.5/site-packages/matplotlib/text.py", line 1233, in draw
    self.arrow.draw(renderer)
  File "/usr/lib/python2.5/site-packages/matplotlib/patches.py", line 261, in draw
    path = self.get_path()
  File "/usr/lib/python2.5/site-packages/matplotlib/patches.py", line 815, in get_path
    xb1, yb1, xb2, yb2 = self.getpoints(x1, y1, x2, y2, k1)
  File "/usr/lib/python2.5/site-packages/matplotlib/patches.py", line 841, in getpoints
    m = (y2-y1)/(x2-x1)
ZeroDivisionError: float division
@sparrow
Danke das mit dem Runden hat geholfen. Sieht jetzt zwar nicht mehr so schön aus ;-) Aber es erfüllt seinen Zweck.
Danke
Antworten