Seite 1 von 1

matplotlib/pyplot contour glitch

Verfasst: Donnerstag 27. Oktober 2011, 10:11
von Khris
Hallo,

ich habe ein weiteres matplotlib-Problem. Beim Plotten von Daten in einem contour/contourf-plot erhalte ich laufend derartige Fehler:

Bild

Irgendwelche zufälligen Werte (sie liegen nicht immer auf der 0-Achse) werden irgendwo an andere zufällige Positionen gesetzt, bevorzugt passiert das offenbar in oder nahe der Wert-Maxima.

Hier meine Daten, schön formatiert, dass man was erkennt:
erste Spalte ist der Radius und erste Zeile sind die Winkel in rad, der Rest sind die Werte.

Code: Alles auswählen

R v  phi > 5.93411945661    6.02138591921    6.10865238181    6.1959188444     0.0              0.0872664625972  0.174532925194   0.261799387792   0.349065850389   
0.0        6.66323800e-27   6.63495900e-27   6.62558200e-27   6.60352100e-27   6.60964200e-27   6.60353600e-27   6.63081200e-27   6.62266000e-27   6.67370700e-27
1000.0     5.07617500e-28   5.05506100e-28   5.05372800e-28   5.04892600e-28   5.04924800e-28   5.04301500e-28   5.06447500e-28   5.02483300e-28   5.08681100e-28
2000.0     1.19625800e-28   1.19687500e-28   1.19434800e-28   1.21356800e-28   1.20680400e-28   1.21217900e-28   1.19609800e-28   1.19236600e-28   1.20479800e-28
3000.0     4.73940300e-29   4.75005900e-29   4.67971300e-29   4.69390500e-29   4.73670700e-29   4.69731600e-29   4.68362300e-29   4.71174500e-29   4.75769300e-29
4000.0     2.27803800e-29   2.25619200e-29   2.24238600e-29   2.26766100e-29   2.26528400e-29   2.26401300e-29   2.24255000e-29   2.24993400e-29   2.24381300e-29
5000.0     1.26492100e-29   1.23364500e-29   1.21194700e-29   1.23386000e-29   1.24348800e-29   1.23284700e-29   1.22068200e-29   1.22731500e-29   1.26649300e-29
6000.0     7.27090000e-30   7.29139200e-30   7.31651100e-30   7.47506300e-30   7.56129800e-30   7.51710800e-30   7.35018700e-30   7.26523500e-30   7.28792100e-30
7000.0     4.84240000e-30   4.94281300e-30   4.81103100e-30   4.74216400e-30   4.78092000e-30   4.72422600e-30   4.83164400e-30   4.90985800e-30   4.85941600e-30
8000.0     3.46022300e-30   3.36890900e-30   3.36682700e-30   3.47580700e-30   3.53494000e-30   3.50597100e-30   3.36803600e-30   3.35559900e-30   3.47584500e-30
9000.0     2.52126400e-30   7.68375000e-15   1.89734800e-14   2.02061400e-14   2.14467300e-14   1.99803000e-14   1.89767200e-14   7.24216400e-15   2.55534900e-30
10000.0    1.85142200e-30   1.82423500e-30   1.43820500e-14   1.45595800e-14   1.40313700e-14   1.43981000e-14   1.47527100e-14   1.79013700e-30   1.83848600e-30
11000.0    1.39464500e-30   1.35859900e-30   1.07465600e-14   1.06635400e-14   1.04482200e-14   1.05019700e-14   1.06057300e-14   1.34122700e-30   1.37726800e-30
12000.0    1.11321900e-30   1.04815300e-30   1.05683000e-14   8.58970100e-15   8.91128700e-15   8.60694000e-15   1.04794800e-14   1.04905800e-30   1.10832300e-30
13000.0    9.18368400e-31   9.13062700e-31   5.37403600e-15   6.42003600e-15   6.16936800e-15   6.61267000e-15   5.64915600e-15   9.03851900e-31   9.14761400e-31
14000.0    7.00807300e-31   7.02818600e-31   1.23738100e-15   2.59884700e-16   8.11517900e-17   2.60080300e-16   1.15727200e-15   6.82047500e-31   7.01547800e-31
15000.0    6.21248000e-31   6.05734700e-31   4.45433800e-31   4.35463100e-31   4.50374500e-31   4.37237700e-31   4.48195100e-31   5.98924400e-31   6.24487000e-31
16000.0    4.60113000e-31   4.55759400e-31   3.44219400e-31   3.45355400e-31   3.54984000e-31   3.50278300e-31   3.45423600e-31   4.53234200e-31   4.59343800e-31
17000.0    3.88027700e-31   3.63775100e-31   2.85746200e-31   2.94679100e-31   3.01306200e-31   2.97427200e-31   2.85796100e-31   3.65410800e-31   3.88137000e-31
18000.0    3.13292200e-31   3.07109300e-31   2.38937100e-31   2.71904700e-31   2.74486800e-31   2.68557200e-31   2.38781200e-31   3.12740300e-31   3.10775300e-31
19000.0    2.76205300e-31   2.80186900e-31   2.10091300e-31   9.73237700e-15   1.05281500e-14   9.88503900e-15   2.12856600e-31   2.77093000e-31   2.72983600e-31
20000.0    2.49702300e-31   2.34838300e-31   1.76394800e-31   7.96850800e-15   8.21310900e-15   7.99789100e-15   1.76659100e-31   2.27167500e-31   2.47694900e-31
21000.0    1.80849900e-31   1.97829300e-31   1.51428000e-31   6.16291100e-15   5.89553600e-15   6.24719100e-15   1.52935100e-31   1.91507700e-31   1.83432800e-31
22000.0    0.00000000e+00   1.72856400e-31   1.33790000e-31   3.86847900e-15   3.75365400e-15   3.76099700e-15   1.32318000e-31   1.70910600e-31   0.00000000e+00
23000.0    0.00000000e+00   1.34097600e-31   1.05938100e-31   3.07086500e-15   2.94236600e-15   3.03065500e-15   1.07009900e-31   1.35241400e-31   0.00000000e+00
24000.0    0.00000000e+00   1.42671900e-31   1.03027800e-31   3.33720200e-16   4.31261900e-17   3.24715300e-16   1.04618400e-31   1.34839200e-31   0.00000000e+00
25000.0    0.00000000e+00   1.08768000e-31   8.10124000e-32   2.62574900e-32   2.73529600e-32   2.68257200e-32   8.25234000e-32   1.09585400e-31   0.00000000e+00
26000.0    0.00000000e+00   9.54718700e-32   7.29123200e-32   2.55412300e-32   2.55192400e-32   2.53944200e-32   7.31652200e-32   9.45355200e-32   0.00000000e+00
27000.0    0.00000000e+00   9.84080700e-32   7.48426800e-32   2.67712600e-32   2.73357400e-32   2.69229200e-32   7.54522300e-32   9.84420400e-32   0.00000000e+00
28000.0    0.00000000e+00   7.13572700e-32   5.87199500e-32   1.96148900e-32   2.01615700e-32   2.00997900e-32   5.94829700e-32   7.28160700e-32   0.00000000e+00
29000.0    0.               0.               0.               0.               0.               0.               0.               0.               0.
Der gesamte Code ist lang, daher hier nur der relevante Teil zum Plotten:

Code: Alles auswählen

    R=zeros((l_num))
    pi = 3.1415926535
    for i in range(l_num):
      R[i]=0.5*results[1][i][0]
    for i in range(var_num):
      var_one[i]=var_one[i]*pi/180
    pl=figure()
    ax=pl.add_axes([0.0,0.1,0.8,0.8], projection='polar')
    contourf(var_one,R,results[5])
Ich benutze hier matplotlib 1.0.1, die neueste Version wurde hier auf der Arbeit noch nicht aufgespielt.
Ist das einfach ein Bug, der in der neuen Version gefixt wurde, oder ist hier woanders der Fehler?
Kann es daran liegen, dass ich numpy-Arrays benutze?

Re: matplotlib/pyplot contour glitch

Verfasst: Donnerstag 27. Oktober 2011, 14:29
von CM
Hallo
Khris hat geschrieben:Ich benutze hier matplotlib 1.0.1, die neueste Version wurde hier auf der Arbeit noch nicht aufgespielt.
Ist das einfach ein Bug, der in der neuen Version gefixt wurde, oder ist hier woanders der Fehler?
Möglich
Khris hat geschrieben:Kann es daran liegen, dass ich numpy-Arrays benutze?
Wohl kaum.

Du zeigst zwar Deine Daten, aber es ist leider nicht klar (jedenfalls mir nicht) was da was ist. Meine Vermutung: Die Umwandlung radian-Grad klappt nahe Null nicht verläßlich, so daß einige Daten auf völlig falsche Koordinaten projiziert werden.

Wenn var_one ein numpy array ist könnte dieser Code (bzw. ein Teil davon) etwas verständlicher zu lesen sein als Deine Konversion:

Code: Alles auswählen

>>> import numpy as np
>>> a = np.linspace(0, np.pi, 10)
>>> a
array([ 0.        ,  0.34906585,  0.6981317 ,  1.04719755,  1.3962634 ,
        1.74532925,  2.0943951 ,  2.44346095,  2.7925268 ,  3.14159265])
>>> np.degrees(a)
array([   0.,   20.,   40.,   60.,   80.,  100.,  120.,  140.,  160.,  180.])
>>> np.radians(np.degrees(a))
array([ 0.        ,  0.34906585,  0.6981317 ,  1.04719755,  1.3962634 ,
        1.74532925,  2.0943951 ,  2.44346095,  2.7925268 ,  3.14159265])
Ob das allerdings ein Ansatz zur Lösung sein kann, erschließt sich mir nicht.

HTH
Christian

Re: matplotlib/pyplot contour glitch

Verfasst: Donnerstag 27. Oktober 2011, 14:41
von CM
Außerdem:

Code: Alles auswählen

from math import pi
>>> pi - 3.1415926535
8.979306187484326e-11
Dein Pi ist also nicht so genau, wie es auf Deiner Maschine wahrscheinlich sein könnte. Aber, wie gesagt, wenn var_one ein numpy-array ist, ist die Konversion mit der Numpy-Routine wohl die schnellste, kürzeste und womöglich stabilste Lösung.

Was ist eigentlich die zweite Koordinate? Und wie wird sie ggf. konvertiert?

Re: matplotlib/pyplot contour glitch

Verfasst: Freitag 28. Oktober 2011, 09:27
von Khris
Hallo CM,

danke für die Anregungen.
CM hat geschrieben: Du zeigst zwar Deine Daten, aber es ist leider nicht klar (jedenfalls mir nicht) was da was ist.
Die erste Spalte ist einfach der Radius (in m), die erste Zeile ist der Winkel in rad, und der Rest, also diese schrecklich kleinen Zahlen sind die jeweiligen Messwerte an den jeweiligen Punkten.
CM hat geschrieben:Meine Vermutung: Die Umwandlung radian-Grad klappt nahe Null nicht verläßlich, so daß einige Daten auf völlig falsche Koordinaten projiziert werden.
Vielleicht, wobei es auch mal Datenpunkte trifft, die nicht direkt auf der Null liegen. ich werde einfach mal deine Anregungen ausprobieren, vielleicht hilft etwas davon.

Re: matplotlib/pyplot contour glitch

Verfasst: Freitag 28. Oktober 2011, 14:41
von CM
Ok, ich kann den Fehler mit anderem Code (selbe mpl-Version) reproduzieren. Ich habe eine Weile an den Zahlen gespielt und nachgedacht. (U. a. fiel mir auf, daß Du ja gar nicht konvertieren mußt.) Und ich habe keine Lösung gefunden. Gelegenheit für einen Bugreport?

Re: matplotlib/pyplot contour glitch

Verfasst: Montag 31. Oktober 2011, 09:11
von Khris
CM hat geschrieben:Ok, ich kann den Fehler mit anderem Code (selbe mpl-Version) reproduzieren. Ich habe eine Weile an den Zahlen gespielt und nachgedacht. (U. a. fiel mir auf, daß Du ja gar nicht konvertieren mußt.) Und ich habe keine Lösung gefunden. Gelegenheit für einen Bugreport?
Oh, danke für diese Mühe, gut zu hören, dass es wohl tatsächlich am Code liegt.
Aber bevor ich hier einen Bugreport schreibe, will ich sehen, ob der Fehler in mpl 1.1.0 auftritt.