xlabel example color python matplotlib colorbar

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:

  1. 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()
  2. 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:

  1. Borre toda la figura y agregue de nuevo la subparcela (+ barra de colores si lo desea).

  2. 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()