matplotlib: fehler mit loglog

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
kommando_pimperlepim
User
Beiträge: 23
Registriert: Dienstag 3. April 2007, 05:32

hallo. wenn ich in folgendem code

Code: Alles auswählen

from pylab import *
from numpy import *

x=linspace(0,10,10,endpoint=True)
figure(0)
axis([10**-12, 1, 0, 1])
subplot(111, autoscale_on=False)
plot(x,x**2)
show()
den befehl plot durch loglog ersetze, um eine doppelt logarithmische achseneinteilung zu erhalten, liefert mir python unzählige fehlermeldungen und kann die funktion nicht darstellen.

lässt sich da was machen?

wenn es jemandem was sagt, ich erhalten sowas wie folgendes:

e 194, in motion_notify_event
FigureCanvasBase.motion_notify_event(self, x, y, guiEvent=event)
File "C:\Python25\lib\site-packages\matplotlib\backend_bases.py", line 937, in
motion_notify_event
func(event)
File "C:\Python25\lib\site-packages\matplotlib\backend_bases.py", line 1247, i
n mouse_move
try: s = event.inaxes.format_coord(event.xdata, event.ydata)
File "C:\Python25\lib\site-packages\matplotlib\axes.py", line 1610, in format_
coord
xs = self.format_xdata(x)
File "C:\Python25\lib\site-packages\matplotlib\axes.py", line 1592, in format_
xdata
val = func(x)
File "C:\Python25\lib\site-packages\matplotlib\ticker.py", line 157, in format
_data_short
return self.format_data(value)
File "C:\Python25\lib\site-packages\matplotlib\ticker.py", line 456, in format
_data
value = strip_math(self.__call__(value))
File "C:\Python25\lib\site-packages\matplotlib\ticker.py", line 526, in __call
__
fx = math.log(x)/math.log(b)
TypeError: a float is required
kommando_pimperlepim
User
Beiträge: 23
Registriert: Dienstag 3. April 2007, 05:32

Problem gelöst: Wenn man die Zeile

Code: Alles auswählen

axis([10**-12, 1, 0, 1])
weglässt, funktioniert es seltsamerweise. :?:
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

axis() kannst Du ruhig drin lassen, aber dann solltest Du subplot(111) rausschmeißen. Nur figure(), axis() UND subplot() zusammen das geht nicht. Allerdings sind die Fehlermeldungen nicht sehr aussagekräftig. Bei mir erscheint eine andere als bei Dir und die beschwert sich über das backend:

>>> show()
data freeze value error [0.125, 0.099999999999999978, 0.77500000000000002, 0.80000000000000004] (0.0, 0.0, 10.0, 100.0) (0.0, 0.0, 1.0, 1.0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/lib64/python2.4/site-packages/matplotlib/backends/backend_wx.py", line 1193, in show
figwin.canvas.draw()
File "/usr/lib64/python2.4/site-packages/matplotlib/backends/backend_wxagg.py", line 61, in draw
FigureCanvasAgg.draw(self)
File "/usr/lib64/python2.4/site-packages/matplotlib/backends/backend_agg.py", line 392, in draw
self.figure.draw(renderer)
File "/usr/lib64/python2.4/site-packages/matplotlib/figure.py", line 545, in draw
for a in self.axes: a.draw(renderer)
File "/usr/lib64/python2.4/site-packages/matplotlib/axes.py", line 1006, in draw
try: self.transData.freeze() # eval the lazy objects
ValueError: Domain error on eval_scalars in Transformation::freeze

Insgesamt: Völlige Ahnungslosigkeit auf meiner Seite. Weiß jemand was da los ist oder möchte mal jemand auf der Mailingliste nachfragen?

Gruß,
Christian
Goa
User
Beiträge: 18
Registriert: Dienstag 10. Oktober 2006, 11:00

ich denke die Lösung ist recht einfach: der Computer mag log(0) nich so wirklich. starte mal deine Liste nicht von 0 sondern von 0.1, und die y achse sollte auch nich von 0-1 sondern von 0.1-1 gehen.
Seltsamerweise funktioniert aber genau dein Code bei mir trotzdem :?:
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Der Einwand ist nicht relevant, da matplotlib bei logarithmierten Achsen Werte <= 0 einfach ignoriert. Damit gab es noch nie Probleme. Außerdem deutet die Fehlermeldung in beiden Fällen nicht auf ein Problem im mathematischen Bereich.

Wer mag kann ja mal den arcsinh berechnen und diesen als Kontrolle plotten.

Gruß,
Christian
Goa
User
Beiträge: 18
Registriert: Dienstag 10. Oktober 2006, 11:00

kommando_pimperlepim hat geschrieben: fx = math.log(x)/math.log(b)
TypeError: a float is required
Für mich klingt das schon irgendwie nach einem Fehler im mathematischen Bereich.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Klingen schon, aber die Exception kommt aus ticker.py und hat damit nichts mit der Darstellung der Daten, sondern nur mit dem Bereich der Ticks zu tun. Der relevante Code ist:

Code: Alles auswählen

class LogFormatter(Formatter):
<snip>
    def __call__(self, x, pos=None):
        'Return the format for tick val x at position pos'
        self.verify_intervals()
        d = abs(self.viewInterval.span())
        b=self._base
        # only label the decades
        fx = math.log(x)/math.log(b)
        isDecade = self.is_decade(fx)
        if not isDecade and self.labelOnlyBase: s = ''
        elif x>10000: s= '%1.0e'%x
        elif x<1: s =  '%1.0e'%x
        else        : s =  self.pprint_val(x,d)
        return s
Die einschlägige Pythonfehlermeldung ist:

Code: Alles auswählen

>>> math.log(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
OverflowError: math range error
Den Fehler, den wir sehen kann man provozieren mit:

Code: Alles auswählen

>>> s = '0'
>>> math.log(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: a float is required
Mit anderen Worten: Ich vermute einen Bug in matplotlib, kann diesen aber nicht selber lokalisieren. kommando_pimperlepim, welche Version benutzt Du? Magst Du ggf. ein Ticket abgeben auf der Bugtrackseite?


Gruß,
Christian

PS Das mit dem arcsinh war nur halbernst gemeint: Es würde nämlich dieselbe Fehlermeldung geben müssen ;-).
kommando_pimperlepim
User
Beiträge: 23
Registriert: Dienstag 3. April 2007, 05:32

Ich habe noch eine Weile mit loglog gearbeitet. Dabei ist mir aufgefallen

Code: Alles auswählen

subplot(111, autoscale_on=False) # loglog funktioniert nicht
subplot(111)                     # loglog funktioniert 
Antworten