python - example - matplotlib title position
eliminar barra de colores de la figura en matplotlib (8)
"on_mappable_changed" funcionó en mi caso. Sin embargo, según los documentos, el método "Típicamente ... no debe llamarse manualmente".
if self.cb:
self.cb.on_mappable_changed(hb)
else:
self.cb = self.fig.colorbar(hb)
Esto debería ser fácil, pero estoy teniendo dificultades con eso. Básicamente, tengo un argumento secundario en matplotlib en el que estoy dibujando un gráfico hexbin cada vez que se llama a una función, pero cada vez que llamo a la función obtengo una nueva barra de colores, así que lo que realmente me gustaría hacer es actualizar la barra de colores. . Desafortunadamente, esto no parece funcionar ya que el objeto a la que está asociada la barra de colores está siendo recreado por subplot.hexbin.
def foo(self):
self.subplot.clear()
hb = self.subplot.hexbin(...)
if self.cb:
self.cb.update_bruteforce() # Doesn''t work (hb is new)
else:
self.cb = self.figure.colorbar(hb)
Ahora estoy en este lugar molesto donde estoy tratando de eliminar los ejes de la barra de colores y simplemente recrearlo. Desafortunadamente, cuando elimino los ejes de la barra de color, los ejes de la subparcela no recuperan el espacio, y llamar a self.subplot.reset_position () no hace lo que pensé que haría.
def foo(self):
self.subplot.clear()
hb = self.subplot.hexbin(...)
if self.cb:
self.figure.delaxes(self.figure.axes[1])
del self.cb
# TODO: resize self.subplot so it fills the
# whole figure before adding the new colorbar
self.cb = self.figure.colorbar(hb)
¿Alguien tiene alguna sugerencia?
¡Muy apreciado! Adán
Bien, aquí está mi solución. No es terriblemente elegante, pero tampoco es un truco terrible.
def foo(self):
self.subplot.clear()
hb = self.subplot.hexbin(...)
if self.cb:
self.figure.delaxes(self.figure.axes[1])
self.figure.subplots_adjust(right=0.90) #default right padding
self.cb = self.figure.colorbar(hb)
Esto funciona para mis necesidades ya que solo tengo un solo argumento secundario. Las personas que se encuentren con el mismo problema al usar múltiples subparcelas o al dibujar la barra de colores en una posición diferente deberán ajustarse.
Creo que el problema es que con del
cancelas la variable, pero no la barra de colores del objeto al que se hace referencia. Si desea que la barra de colores se elimine de la trama y desaparezca, debe usar el método remove
de la instancia de la barra de colores y para ello debe tener la barra de colores en una variable, para la cual tiene dos opciones:
- manteniendo la barra de colores en un valor en el momento de la creación, como se muestra en otras respuestas, por ejemplo,
cb=plt.colorbar()
- recupere una barra de colores existente, que puede hacer después de (y upvoting :) lo que escribí aquí: Cómo recuperar una instancia de la barra de colores de la figura en matplotlib entonces:
cb.remove() plt.draw() #update plot
Estoy usando matplotlib 1.4.0. Así es como soluciono este problema:
import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
# A contour plot example:
delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
Z = 10.0 * (Z2 - Z1)
#
# first drawing
fig = plt.figure()
ax = fig.add_subplot(111) # drawing axes
c = ax.contourf(Z) # contour fill c
cb = fig.colorbar(c) # colorbar for contour c
# clear first drawimg
ax.clear() # clear drawing axes
cb.ax.clear() # clear colorbar axes
# replace with new drawing
# 1. drawing new contour at drawing axes
c_new = ax.contour(Z)
# 2. create new colorbar for new contour at colorbar axes
cb_new = ax.get_figure().colorbar(c_new, cax=cb.ax)
plt.show()
El código anterior dibuja un trazado de relleno de contorno con la barra de colores, elimínelo y dibuje un nuevo trazado de contorno con la nueva barra de colores en la misma figura.
Al usar cb.ax
puedo identificar los ejes de la barra de color y borrar la barra de color antigua. Y especificando cax=cb.ax
simplemente dibuja la nueva barra de color en los ejes de la barra de color antiguos.
Logré resolver el mismo problema usando fig.clear () y display.clear_output ()
import matplotlib.pyplot as plt
import IPython.display as display
import matplotlib.tri as tri
from pylab import *
%matplotlib inline
def plot_res(fig):
ax=fig.add_axes([0,0,1,1])
ax.set_xlabel("x")
ax.set_ylabel(''y'')
plotted=ax.imshow(rand(250, 250))
ax.set_title("title")
cbar=fig.colorbar(mappable=plotted)
display.clear_output(wait=True)
display.display(plt.gcf())
fig.clear()
fig=plt.figure()
N=20
for j in range(N):
plot_res(fig)
Necesitaba eliminar las barras de colores porque estaba trazando un pcolormesh y agregando la barra de colores a una figura en un bucle. Cada bucle crearía una nueva barra de colores y, después de diez bucles, tendría diez barras de colores. Eso fue malo.
Para eliminar las barras de colores, nombro la variable pcolormesh y la barra de colores como una variable, luego al final de mi bucle las elimino. Es importante eliminar la barra de colores antes de eliminar la pcolormesh.
Código de Psudo:
for i in range(0,10):
p = plt.pcolormesh(datastuff[i])
cb = plt.colorbar(p)
plt.savefig(''name_''+i)
cb.remove()
p.remove()
Nuevamente, fue necesario eliminar la barra de colores antes de la pcolormesh
No quiero quitarle nada al autor de esta publicación del blog (Joseph Long), pero esta es claramente la mejor solución que he encontrado hasta ahora. Incluye piezas de código, grandes explicaciones y muchos ejemplos.
Para resumir, a partir de cualquier salida de un eje del comando: gráfico , imagen , dispersión , colección , etc. como:
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(5,5), dpi=300)
ax = fig.add_subplot(1, 1, 1)
data = ax.plot(x,y)
# or
data = ax.scatter(x, y, z)
# or
data = ax.imshow(z)
# or
data = matplotlib.collection(patches)
ax.add_collection(data)
Puede crear un eje de barra de color utilizando make_axes_locatable y el eje original de la gráfica.
from mpl_toolkits.axes_grid1 import make_axes_locatable
# the magical part
divider = make_axes_locatable(ax)
caxis = divider.append_axes("right", size="5%", pad=0.05)
fig.colorbar(data, cax=caxis)
plt.show()
La barra de colores creada tendrá el mismo tamaño que la figura o la trama secundaria y puede modificar su ancho , ubicación y relleno al usar el comando divider.append_axes .
Tuve un problema similar y jugué un poco. Se me ocurrieron dos soluciones que podrían ser un poco más elegantes:
Borre toda la figura y agregue de nuevo la subparcela (+ barra de colores si lo desea).
Si siempre hay una barra de colores, simplemente puede actualizar los ejes con autoescala que también actualiza la barra de colores.
He intentado esto con imshow, pero creo que funciona de manera similar para otros métodos de trazado.
from pylab import *
close(''all'') #close all figures in memory
#1. Figures for fig.clf method
fig1 = figure()
fig2 = figure()
cbar1=None
cbar2=None
data = rand(250, 250)
def makefig(fig,cbar):
fig.clf()
ax = fig.add_subplot(111)
im = ax.imshow(data)
if cbar:
cbar=None
else:
cbar = fig.colorbar(im)
return cbar
#2. Update method
fig_update = figure()
cbar3=None
data_update = rand(250, 250)
img=None
def makefig_update(fig,im,cbar,data):
if im:
data*=2 #change data, so there is change in output (look at colorbar)
#im.set_data(data) #use this if you use new array
im.autoscale()
#cbar.update_normal(im) #cbar is updated automatically
else:
ax = fig.add_subplot(111)
im = ax.imshow(data)
cbar=fig.colorbar(im)
return im,cbar,data
#Execute functions a few times
for i in range(3):
print i
cbar1=makefig(fig1,cbar1)
cbar2=makefig(fig2,cbar2)
img,cbar3,data_update=makefig_update(fig_update,img,cbar3,data_update)
cbar2=makefig(fig2,cbar2)
fig1.show()
fig2.show()
fig_update.show()