matplotlib/pyplot contour glitch

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
Khris
User
Beiträge: 13
Registriert: Dienstag 17. Mai 2011, 11:33

Donnerstag 27. Oktober 2011, 10:11

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?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Donnerstag 27. Oktober 2011, 14:29

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
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Donnerstag 27. Oktober 2011, 14:41

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?
Khris
User
Beiträge: 13
Registriert: Dienstag 17. Mai 2011, 11:33

Freitag 28. Oktober 2011, 09:27

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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Freitag 28. Oktober 2011, 14:41

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?
Khris
User
Beiträge: 13
Registriert: Dienstag 17. Mai 2011, 11:33

Montag 31. Oktober 2011, 09:11

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.
Antworten