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()
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. –
+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
Estaba pensando en usar un artista proxy, pero creo que puede haber una manera más limpia. Añadiré un ejemplo. –