graficas - plot title python
MĂșltiples subplots imshow, cada uno con barra de colores (1)
Quiero tener una figura que consiste en, digamos, cuatro subparcelas. Dos de ellos son trazados de líneas habituales, dos de ellos imshow-images.
Puedo formatear las imshow-images a los propios gráficos, porque cada una de ellas necesita su propia barra de colores, un eje modificado y el otro eje eliminado. Esto, sin embargo, parece ser absolutamente inútil para la sub-trama. Alguien me puede ayudar con eso?
Utilizo esto para mostrar los datos de las gráficas "regulares" de arriba como un mapa de colores (al escalar la matriz de entrada i
a [ i, i, i, i, i, i ]
para 2D y llamar a imshow()
con él).
El siguiente código primero muestra lo que necesito como una trama secundaria y el segundo muestra todo lo que puedo hacer, lo cual no es suficiente.
#!/usr/bin/env python
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
s = { ''t'':1, ''x'':[1,2,3,4,5,6,7,8], ''D'':[0.3,0.5,0.2,0.3,0.5,0.5,0.3,0.4] }
width = 40
# how I do it in just one plot
tot = []
for i in range(width):
tot.append(s[''D''])
plt.imshow(tot, norm=LogNorm(vmin=0.001, vmax=1))
plt.colorbar()
plt.axes().axes.get_xaxis().set_visible(False)
plt.yticks([0, 2, 4, 6], [s[''x''][0], s[''x''][2], s[''x''][4], s[''x''][6]])
plt.show()
f = plt.figure(figsize=(20,20))
plt.subplot(211)
plt.plot(s[''x''], s[''D''])
plt.ylim([0, 1])
#colorplot
sp = f.add_subplot(212)
#reshape (just necessary to see something)
tot = []
for i in range(width):
tot.append(s[''D''])
sp.imshow(tot, norm=LogNorm(vmin=0.001, vmax=1))
#what I can''t do now but needs to be done:
#sp.colorbar()
#sp.axes().axes.get_xaxis().set_visible(False)
#sp.yticks([0, 200, 400, 600, 800, 1000], [s[''x''][0], s[''x''][200], s[''x''][400], s[''x''][600], s[''x''][800], s[''x''][1000]])
plt.show()
Puede utilizar la interfaz orientada a objetos matplotlibs en lugar de la interfaz de la máquina de estados para obtener un mejor control sobre cada eje. Además, para obtener control sobre la altura / anchura de la barra de colores, puede hacer uso del kit de herramientas AxesGrid de matplotlib.
Por ejemplo:
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable
from matplotlib.colors import LogNorm
from matplotlib.ticker import MultipleLocator
s = {''t'': 1,
''x'': [1, 2, 3, 4, 5, 6, 7, 8],
''T'': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8],
''D'': [0.3, 0.5, 0.2, 0.3, 0.5, 0.5, 0.3, 0.4]}
width = 40
tot = np.repeat(s[''D''],width).reshape(len(s[''D'']), width)
tot2 = np.repeat(s[''T''],width).reshape(len(s[''D'']), width)
fig, (ax1, ax2, ax3, ax4) = plt.subplots(1,4)
fig.suptitle(''Title of figure'', fontsize=20)
# Line plots
ax1.set_title(''Title of ax1'')
ax1.plot(s[''x''], s[''T''])
ax1.set_ylim(0,1)
ax2.set_title(''Title of ax2'')
ax2.plot(s[''x''], s[''D''])
# Set locations of ticks on y-axis (at every multiple of 0.25)
ax2.yaxis.set_major_locator(MultipleLocator(0.25))
# Set locations of ticks on x-axis (at every multiple of 2)
ax2.xaxis.set_major_locator(MultipleLocator(2))
ax2.set_ylim(0,1)
ax3.set_title(''Title of ax3'')
# Display image, `aspect=''auto''` makes it fill the whole `axes` (ax3)
im3 = ax3.imshow(tot, norm=LogNorm(vmin=0.001, vmax=1), aspect=''auto'')
# Create divider for existing axes instance
divider3 = make_axes_locatable(ax3)
# Append axes to the right of ax3, with 20% width of ax3
cax3 = divider3.append_axes("right", size="20%", pad=0.05)
# Create colorbar in the appended axes
# Tick locations can be set with the kwarg `ticks`
# and the format of the ticklabels with kwarg `format`
cbar3 = plt.colorbar(im3, cax=cax3, ticks=MultipleLocator(0.2), format="%.2f")
# Remove xticks from ax3
ax3.xaxis.set_visible(False)
# Manually set ticklocations
ax3.set_yticks([0.0, 2.5, 3.14, 4.0, 5.2, 7.0])
ax4.set_title(''Title of ax4'')
im4 = ax4.imshow(tot2, norm=LogNorm(vmin=0.001, vmax=1), aspect=''auto'')
divider4 = make_axes_locatable(ax4)
cax4 = divider4.append_axes("right", size="20%", pad=0.05)
cbar4 = plt.colorbar(im4, cax=cax4)
ax4.xaxis.set_visible(False)
# Manually set ticklabels (not ticklocations, they remain unchanged)
ax4.set_yticklabels([0, 50, 30, ''foo'', ''bar'', ''baz''])
plt.tight_layout()
# Make space for title
plt.subplots_adjust(top=0.85)
plt.show()
Puede cambiar las ubicaciones y las etiquetas de las marcas en cualquiera de los ejes con los métodos set_ticks
y set_ticklabels
como en el ejemplo anterior.
En cuanto a lo que hace la función make_axes_locatable
, del sitio matplotlib sobre el kit de herramientas AxesGrid :
El módulo axes_divider proporciona una función auxiliar make_axes_locatable, que puede ser útil. Toma una instancia de ejes existente y crea un divisor para ella.
ax = subplot(1,1,1) divider = make_axes_locatable(ax)
make_axes_locatable devuelve una instancia de la clase AxesLocator, derivada del Localizador. Proporciona el método append_axes que crea un nuevo eje en el lado dado de ("arriba", "derecha", "abajo" e "izquierda") de los ejes originales.