2012-01-18 11 views
8

Soy nuevo en Python (era un usuario de IDL de antemano) así que espero que me pregunte esto de una manera comprensible. He estado tratando de crear un gráfico polar con x número de ubicaciones donde se promedian los datos en el contenedor y se les da un color asociado con ese valor. Esto parece funcionar bien al usar el comando plt.fill donde puedo definir el bin y luego el color de relleno. El problema viene cuando trato de hacer una barra de color para acompañarlo. Sigo recibiendo errores que indican AttributeError: el objeto 'Figure' no tiene ningún atributo 'autoscale_None'Creando una barra de color para una gráfica hecha con plt.fill

Cualquier consejo sería útil gracias.

import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib as mpl 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
from matplotlib.pyplot import figure, show, rc, grid 
import pylab 

r = np.arange(50)/5. 
rstep = r[1] - r[0] 
theta = np.arange(50)/50.*2.*np.pi 
tstep = theta[1] - theta[0] 
colorv = np.arange(50)/50. 

# force square figure and square axes looks better for polar, IMO 
width, height = mpl.rcParams['figure.figsize'] 
size = min(width, height) 
# make a square figure 
fig = figure(figsize=(size, size)) 
ax = fig.add_axes([0.1, 0.1, .8, .8])#, polar=True) 

my_cmap = cm.jet 
for j in range(len(r)): 
    rbox = np.array([r[j], r[j], r[j]+ rstep, r[j] + rstep]) 
    for i in range(len(theta)): 
     thetabox = np.array([theta[i], theta[i] + tstep, theta[i] + tstep, theta[i]]) 
     x = rbox*np.cos(thetabox) 
     y = rbox*np.sin(thetabox) 
     plt.fill(x,y, facecolor = my_cmap(colorv[j])) 



# Add colorbar, make sure to specify tick locations to match desired ticklabels 
cbar = fig.colorbar(fig, ticks=[np.min(colorv), np.max(colorv)]) 
cb = plt.colorbar() 
plt.show() 

* aquí es un poco mejor ejemplo de mis datos reales, hay agujeros que faltan en todas partes, por lo que en este ejemplo que acabo de hacer uno grande en un cuarto de círculo. Cuando he intentado engranar, el código parece intentar interpolar sobre estas regiones.

r = np.arange(50)/50.*7. + 3. 
rstep = r[1] - r[0] 
theta = np.arange(50)/50.*1.5*np.pi - np.pi 
tstep = theta[1] - theta[0] 
colorv = np.sin(r/10.*np.pi) 

# force square figure and square axes looks better for polar, IMO 
width, height = mpl.rcParams['figure.figsize'] 
size = min(width, height) 
# make a square figure 
fig = figure(figsize=(size, size)) 
ax = fig.add_axes([0.1, 0.1, .8, .8])#, polar=True) 

my_cmap = cm.jet 

for j in range(len(r)): 
    rbox = np.array([r[j], r[j], r[j]+ rstep, r[j] + rstep]) 
    for i in range(len(theta)): 
     thetabox = np.array([theta[i], theta[i] + tstep, theta[i] + tstep, theta[i]]) 
     x = rbox*np.cos(thetabox) 
     y = rbox*np.sin(thetabox) 
     plt.fill(x,y, facecolor = my_cmap(colorv[j])) 


# Add colorbar, make sure to specify tick locations to match desired ticklabels 
#cbar = fig.colorbar(fig, ticks=[np.min(colorv), np.max(colorv)]) 
#cb = plt.colorbar() 
plt.show() 

y luego con un mallado involucrados ...

de gridData importación matplotlib.mlab

r = np.arange(50)/5. 
rstep = r[1] - r[0] 
theta = np.arange(50)/50.*1.5*np.pi - np.pi 
tstep = theta[1] - theta[0] 
colorv = np.sin(r/10.*np.pi) 

# force square figure and square axes looks better for polar, IMO 
width, height = mpl.rcParams['figure.figsize'] 
size = min(width, height) 
# make a square figure 
fig = figure(figsize=(size, size)) 
ax = fig.add_axes([0.1, 0.1, .8, .8])#, polar=True) 

my_cmap = cm.jet 

x = r*np.cos(theta) 
y = r*np.sin(theta) 
X,Y = np.meshgrid(x,y) 

data = griddata(x,y,colorv,X,Y) 
cax = plt.contourf(X,Y, data) 
plt.colorbar() 

# Add colorbar, make sure to specify tick locations to match desired ticklabels 
#cbar = fig.colorbar(fig, ticks=[np.min(colorv), np.max(colorv)]) 
#cb = plt.colorbar() 
plt.show() 

Respuesta

1

Así que he encontrado una solución. Como conozco una región en la que definitivamente no tendré datos, tracé algunos allí. Me he asegurado de que los datos cubran todo el rango de lo que estoy macetando.Luego lo cubro (esta región iba a estar cubierta de todos modos, muestra dónde se encuentra la "tierra"). Ahora puedo seguir y usar plt.fill como originalmente y usar la barra de colores de los datos al azar. Sé que esta no es probablemente la forma correcta, pero funciona y no trata de interpolar mis datos.

Muchas gracias por ayudar a obtener este ordenado. y si sabes de una mejor manera, ¡me encantaría escucharlo!

hid = plt.pcolormesh(X,Y, data, antialiased=True) 

#here we cover up the region that we just plotted in 
r3 = [1 for i in range(360)] 
theta3 = np.arange(360)*np.pi/180. 
plt.fill(theta3, r3, 'w') 

#now we can go through and fill in all the regions 
for j in range(len(r)): 
    rbox = np.array([r[j], r[j], r[j]+ rstep, r[j] + rstep]) 
    for i in range(len(theta)): 
     thetabox = np.array([theta[i], theta[i] + tstep, theta[i] + tstep, theta[i]]) 
     x = rbox*np.cos(thetabox) 
     y = rbox*np.sin(thetabox) 
     colorv = np.sin(r[j]/10.*np.pi) 
     plt.fill(thetabox,rbox, facecolor = my_cmap(colorv)) 
#And now we can plot the color bar that fits the data Tada :) 
plt.colorbar() 
plt.show() 

Output of above code

7

colorbar necesita cosas para ser una instancia de ScalarMappable con el fin de hacer una barra de colores de los mismos .

Dado que está configurando manualmente cada mosaico, no hay nada que esencialmente tenga una barra de color.

Existen varias formas de falsificarlo en su mapa de colores, pero en este caso hay una solución mucho más simple.

pcolormesh hace exactamente lo que quiere, y será mucho más rápido.

A modo de ejemplo:

import numpy as np 
import matplotlib.pyplot as plt 

# Linspace makes what you're doing _much_ easier (and includes endpoints) 
r = np.linspace(0, 10, 50) 
theta = np.linspace(0, 2*np.pi, 50) 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='polar') 

# "Grid" r and theta into 2D arrays (see the docs for meshgrid) 
r, theta = np.meshgrid(r, theta) 
cax = ax.pcolormesh(theta, r, r, edgecolors='black', antialiased=True) 

# We could just call `plt.colorbar`, but I prefer to be more explicit 
# and pass in the artist that I want it to extract colors from. 
fig.colorbar(cax) 

plt.show() 

enter image description here

O, si lo prefiere ejes no polares, como en el código de ejemplo:

import numpy as np 
import matplotlib.pyplot as plt 

r = np.linspace(0, 10, 50) 
theta = np.linspace(0, 2*np.pi, 50) 

# "Grid" r and theta and convert them to cartesian coords... 
r, theta = np.meshgrid(r, theta) 
x, y = r * np.cos(theta), r * np.sin(theta) 

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.axis('equal') 

cax = ax.pcolormesh(x, y, r, edgecolors='black', antialiased=True) 

fig.colorbar(cax) 

plt.show() 

enter image description here

Nota: si prefiere que las líneas de límite sean menos oscuras, solo especifique linewidth=0.5 o algo similar a pcolormesh.

Por último, si desea hacer directamente la barra de colores del mapa de colores en su código original, debe crear una instancia de ScalarMappable y pasarlo a colorbar. Es más fácil de lo que parece, pero es un poco detallado.

A modo de ejemplo, en el código original, si haces algo como lo siguiente:

cax = cm.ScalarMappable(cmap=my_cmap) 
cax.set_array(colorv) 
fig.colorbar(cax) 

Se debe hacer lo que quiera.

+1

En una nota, el 'suavizado = TRUE kwarg en general no será necesario para los comandos matplotlib (que es el valor por defecto para la mayoría de las cosas). 'pcolormesh' se establece de manera predeterminada como antiailsing por motivos de rendimiento, ya que las" celdas "de malla a menudo son verticales y se ven bien sin antialiasing. En este caso, las celdas no son verticales, y el rendimiento alcanzado no es demasiado malo, por lo que es una buena idea dibujar la malla con antialiasing activado. –

+0

+1, por cierto: "Hay varias formas de falsificarlo en su mapa de colores". ¿Podría darnos alguna pista/ejemplo? He intentado obtener la barra de colores del código OP sin éxito ... – joaquin

+0

Estaba pensando en usar un artista proxy, pero creo que puede haber una manera más limpia. Añadiré un ejemplo. –

Cuestiones relacionadas