Pandas, meshgrid und contourf

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
Lienz20013
User
Beiträge: 88
Registriert: Freitag 26. September 2014, 14:42

Hi, ich versuch mit einem Panda DataFrame einen contourf Plot zu erstellen jedoch bekomme ich den Fehler:

Code: Alles auswählen

TypeError: ufunc multiply cannot use operands with types dtype('<M8[ns]') and dtype('int32')
und zwar gehe ich dabei wie folgt vor:

Code: Alles auswählen

x = data.index.values

In [27]: x
Out[27]: 
array(['2014-11-18T12:35:00.000000000+0100',
       '2014-11-18T12:36:00.000000000+0100',
       '2014-11-18T12:37:00.000000000+0100'])

y = depth

In [28]: y
Out[28]: 
array([  0. ,   0.5,   1. ,   1.5,   2. ,   2.5 ])

z = data.values[:,::-1].T


In [28]: z
Out[29]: 
array([[ 11.8841629 ,  12.17295074,  12.60788727,  10.25720978,
          9.79065704,   9.86179352],
       [  1.89908528,   1.68134236,   3.22510457,  1.32907808,
          1.25055635,   1.00592744],
       [  4.82364607,   4.84348249,   6.08075666, 4.99564314,
          5.06781721,   4.50266218]])

xi,yi = np.meshgrid(x,y)

temp = plt.contourf(yi,xi,z, alpha = 0.7,cmap = cmap)
Das klappt nicht :( Was mache ich falsch. Ich denke es hat was mit den Zeit-Angaben zu tun und das diese in Nanosekunde sind? Oder?
Lienz20013
User
Beiträge: 88
Registriert: Freitag 26. September 2014, 14:42

Kann keiner helfen? :|
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Du hast zwei Fehler:
contourf kommt nicht mit einem Array mit Strings zurecht. Du musst die Zeitangaben in Float Werte umrechnen.
xi, yi und z müssen die gleiche shape haben
xi und yi haben aber (6, 3) und z hat (3, 6), das kriegst Du mit "z.T" geregelt.

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt

#x = np.array(['2014-11-18T12:35:00.000000000+0100',
#       '2014-11-18T12:36:00.000000000+0100',
#       '2014-11-18T12:37:00.000000000+0100'])
x = np.array([35,36,37])

y = np.array([  0. ,   0.5,   1. ,   1.5,   2. ,   2.5 ])

z = np.array([[ 11.8841629 ,  12.17295074,  12.60788727,  10.25720978,
          9.79065704,   9.86179352],
       [  1.89908528,   1.68134236,   3.22510457,  1.32907808,
          1.25055635,   1.00592744],
       [  4.82364607,   4.84348249,   6.08075666, 4.99564314,
          5.06781721,   4.50266218]])

xi,yi = np.meshgrid(x,y)
print z.shape, xi.shape, yi.shape # (3, 6) (6, 3) (6, 3)

plt.contourf(yi,xi,z.T, alpha = 0.7)
plt.show()
a fool with a tool is still a fool, www.magben.de, YouTube
Lienz20013
User
Beiträge: 88
Registriert: Freitag 26. September 2014, 14:42

Danke das hat ganz gut geklappt aber jetzt habe ich ein weiteres Problem. Und zwar möchte ich cotoure und imshow in einem plotdarstellen. Also so eigentlich:

Code: Alles auswählen

import numpy as np
from pandas import *
from matplotlib import gridspec

fig2 = plt.figure()
fig2.set_size_inches(11.69,8.27)
gs = gridspec.GridSpec(1, 2, width_ratios=(10, 0.2))
gs.update(wspace = 0.1, hspace = 0.2)
ax2 = plt.subplot(gs[0,0])

cmap = plt.cm.spectral
cmap.set_over(color='w',alpha=10)
cmap.set_under(color='k',alpha=10)
#___________________________________________________________________________
#Data
x =    np.array([  1.41631050e+18,   1.41631056e+18,   1.41631062e+18])
           
x = x.astype(float)          
     
y =    np.array([  0. ,   0.5,   1. ,   1.5,   2. ,   2.5 ])
     
z =    np.array([[ 11.8841629 ,  12.17295074,  12.60788727,  10.25720978,
              9.79065704,   9.86179352],
           [  1.89908528,   1.68134236,   3.22510457,  1.32907808,
              1.25055635,   1.00592744],
           [  4.82364607,   4.84348249,   6.08075666, 4.99564314,
              5.06781721,   4.50266218]])
#___________________________________________________________________________     
#plot
ax2.imshow(z.T,cmap=cm.jet,vmin=2,vmax=13,aspect='auto',interpolation='gaussian')

xi,yi = np.meshgrid(x,y)
ax2.contour(yi,xi,z.T,50, alpha = 0.7,colors = 'k')
Einzeln klappts aber zusammen nicht.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Das geht so

Code: Alles auswählen

ax2.imshow(z.T,cmap=plt.cm.jet,vmin=2,vmax=13,aspect='auto',interpolation='gaussian')
ax2.contour(z.T,50, alpha = 0.7,colors = 'k')
oder so

Code: Alles auswählen

ax2.pcolorfast(x,y,z.T,cmap=plt.cm.jet,vmin=2,vmax=13)
ax2.contour(x,y,z.T,50, alpha = 0.7,colors = 'k')
Wobei beides bei Deinen Testdaten nicht besonders gut aussieht.
Es ist nicht schwer geeignete Testdaten für einen hübschen Plot zu erzeugen:

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1,1,100)
y = np.linspace(-1,1,30)
x_2d, y_2d = np.meshgrid(x, y)
z_2d = np.cos(np.pi * x_2d) * np.cos(np.pi * y_2d)

plt.figure()
ax = plt.gca()
ax.pcolorfast(x,y,z_2d)
ax.contour(x,y,z_2d,15, alpha = 0.7,colors = 'k')
plt.show()
a fool with a tool is still a fool, www.magben.de, YouTube
Antworten