2016-04-06 37 views
5

Mam problem z funkcją contourf funkcji matplotlib. Mam plik danych txt, z którego importuję moje dane. Mam kolumny danych (pm1 i pm2) i wykonuję histogram 2D. Chcę wykreślić te dane jako histogram 3D i jako wykres konturu, aby zobaczyć, gdzie znajdują się wartości maksymalne.Histogramy 3D i wykresy konturowe Python

To jest mój kod:

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
rows = np.arange(200,1300,10) 

hist, xedges, yedges = np.histogram2d (pm1_n, pm2_n, bins = (rows, rows)) 
elements = (len(xedges) - 1) * (len(yedges) - 1) 


xpos, ypos = np.meshgrid(xedges[:-1], yedges[:-1]) 

xpos = xpos.flatten() 
ypos = ypos.flatten() 
zpos = np.zeros(elements) 
dx = 0.1 * np.ones_like(zpos) 
dy = dx.copy() 
dz = hist.flatten() 

#####The problem is here##### 

#ax.contourf(xpos,ypos,hist) 
#ax.bar3d(xpos, ypos, zpos, dx, dy, dz, zsort='average') 

plt.show() 

mogę wykreślić 3d wykres słupkowy, ale nie jestem w stanie wykreślić kontur jedna, I miejsce hist w funkcji contourf pojawia się błąd: Length of x must be number of columns in z i jeśli Umieszczam dz Dostaję Input z must be a 2D array Próbowałem również używać xedges i yexges, ale to nie rozwiązuje problemu.

Myślę, że problem jest związany z kształtem powrotu funkcji histogram2D. Ale nie wiem jak to rozwiązać.

Chciałbym również wykonać wykres słupkowy 3D z kodem zmieniającym kolor od minimalnej do maksymalnej wartości. Czy tak jest, aby to zrobić?

Dziękuję

Odpowiedz

1

Może ja nie rozumiem, co dokładnie próbujesz zrobić, ponieważ nie wiem, co dane wygląda, ale wydaje się niewłaściwy mieć swój contourf działkę wspólną osią jak twoje bar3d fabuła. Jeśli dodasz oś bez projekcji 3D do nowej figury, powinieneś być w stanie wykonać dokładnie wykres contourf używając hist. Przykładem na podstawie danych z losowej, rozkładu normalnego:

import numpy as np 
import matplotlib.pyplot as plt 

n_points = 1000 
x = np.random.normal(0, 2, n_points) 
y = np.random.normal(0, 2, n_points) 

hist, xedges, yedges = np.histogram2d(x, y, bins=np.sqrt(n_points)) 

fig2D = plt.figure() 
ax2D = fig2D.add_subplot(111) 
ax2D.contourf(hist, interpolation='nearest', 
       extent=(xedges[0], xedges[-1], yedges[0], yedges[-1])) 
plt.show() 

zwraca obraz jak this.

Co do drugiego pytania, dotycząca kolorem 3D bar działce, jak na ten temat (stosując te same dane jak wyżej, ale z 1/10 wielkości):

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
import matplotlib.colors as colors 

n_points = 100 
x = np.random.normal(0, 2, n_points) 
y = np.random.normal(0, 2, n_points) 

hist, xedges, yedges = np.histogram2d(x, y, bins=np.sqrt(n_points)) 

# Following your data reduction process 
xpos, ypos = np.meshgrid(xedges[:-1], yedges[:-1]) 

length, width = 0.4, 0.4 
xpos = xpos.flatten() 
ypos = ypos.flatten() 
zpos = np.zeros(n_points) 
dx = np.ones(n_points) * length 
dy = np.ones(n_points) * width 
dz = hist.flatten() 

# This is where the colorbar customization comes in 
dz_normed = dz/dz.max() 
normed_cbar = colors.Normalize(dz_normed.min(), dz_normed.max()) 
# Using jet, but should work with any colorbar 
color = cm.jet(normed_cbar(dz_normed)) 

fig3D = plt.figure() 
ax3D = fig3D.add_subplot(111, projection='3d') 
ax3D.bar3d(xpos, ypos, zpos, dx, dy, dz, color=color) 
plt.show() 

dostaję this image.

+0

Odwołania do linii dostosowania paska kolorów: [przykład pirlaba] (http://matplotlib.org/examples/pylab_examples/hist_colormapped.html) i [ten post] (http://stackoverflow.com/questions/11950375/apply -color-map-to-mpl-toolkits-mplot3d-axes3d-bar3d) – lanery