2012-02-26 53 views
13

En la figura siguiente, cada unidad en el eje x representa un intervalo de 10 minutos. Me gustaría personalizar las etiquetas del eje X, de modo que muestre las horas, es decir, que muestre un ticker cada 6 unidades (60 minutos). Soy nuevo en matplotlib. ¿Alguien podría ayudarme? Gracias ~ enter image description herePersonalice el eje x en matplotlib

Aquí está el código para la figura anterior.

x = arange(0, size_x, dx) 
y = arange(0, size_y, dy) 
X,Y = meshgrid(x, y) 
Z = foo(x,y) 
pcolor(X, Y, Z, cmap=cm.Reds) 
colorbar() 
axis([0,size_x-1,0,size_y-1]) 
show() 

Respuesta

34

Hay más de una forma de hacerlo.

Vamos a empezar con un ejemplo parcela:

import matplotlib.pyplot as plt 
import matplotlib as mpl 
import numpy as np 

# Generate some data... 
x, y = np.mgrid[:141, :101] 
z = np.cos(np.hypot(x, y)) 

# Plot the figure... 
plt.pcolormesh(x, y, z, cmap=mpl.cm.Reds) 

plt.show() 

enter image description here

La forma más simple de hacer lo que quiere sería algo como esto:

import matplotlib.pyplot as plt 
import matplotlib as mpl 
import numpy as np 

# Generate some data... 
x, y = np.mgrid[:141, :101] 
z = np.cos(np.hypot(x, y)) 

# Plot the figure... 
plt.pcolormesh(x, y, z, cmap=mpl.cm.Reds) 

# Set the ticks and labels... 
ticks = np.arange(x.min(), x.max(), 6) 
labels = range(ticks.size) 
plt.xticks(ticks, labels) 
plt.xlabel('Hours') 

plt.show() 

enter image description here

La otra forma implica subclas cante los localizadores y tickers de matplotlib.

Para sus propósitos, el ejemplo anterior está bien.

La ventaja de hacer nuevos localizadores y tickers es que el eje se escalará automáticamente en intervalos razonables de las unidades "dx" que especifique. Si lo está usando como parte de una aplicación más grande, puede valer la pena. Para una sola parcela, es más problemático de lo que vale.

Si realmente quería ir por ese camino, sin embargo, usted haría algo como esto:

import matplotlib.pyplot as plt 
import matplotlib as mpl 
import numpy as np 

def main(): 
    # Generate some data... 
    x, y = np.mgrid[:141, :101] 
    z = np.cos(np.hypot(x, y)) 

    # Plot the figure... 
    fig, ax = plt.subplots() 
    ax.pcolormesh(x, y, z, cmap=mpl.cm.Reds) 
    ax.set_xlabel('Hours') 

    ax.xaxis.set_major_locator(ScaledLocator(dx=6)) 
    ax.xaxis.set_major_formatter(ScaledFormatter(dx=6)) 

    plt.show() 

class ScaledLocator(mpl.ticker.MaxNLocator): 
    """ 
    Locates regular intervals along an axis scaled by *dx* and shifted by 
    *x0*. For example, this would locate minutes on an axis plotted in seconds 
    if dx=60. This differs from MultipleLocator in that an approriate interval 
    of dx units will be chosen similar to the default MaxNLocator. 
    """ 
    def __init__(self, dx=1.0, x0=0.0): 
     self.dx = dx 
     self.x0 = x0 
     mpl.ticker.MaxNLocator.__init__(self, nbins=9, steps=[1, 2, 5, 10]) 

    def rescale(self, x): 
     return x/self.dx + self.x0 
    def inv_rescale(self, x): 
     return (x - self.x0) * self.dx 

    def __call__(self): 
     vmin, vmax = self.axis.get_view_interval() 
     vmin, vmax = self.rescale(vmin), self.rescale(vmax) 
     vmin, vmax = mpl.transforms.nonsingular(vmin, vmax, expander = 0.05) 
     locs = self.bin_boundaries(vmin, vmax) 
     locs = self.inv_rescale(locs) 
     prune = self._prune 
     if prune=='lower': 
      locs = locs[1:] 
     elif prune=='upper': 
      locs = locs[:-1] 
     elif prune=='both': 
      locs = locs[1:-1] 
     return self.raise_if_exceeds(locs) 

class ScaledFormatter(mpl.ticker.OldScalarFormatter): 
    """Formats tick labels scaled by *dx* and shifted by *x0*.""" 
    def __init__(self, dx=1.0, x0=0.0, **kwargs): 
     self.dx, self.x0 = dx, x0 

    def rescale(self, x): 
     return x/self.dx + self.x0 

    def __call__(self, x, pos=None): 
     xmin, xmax = self.axis.get_view_interval() 
     xmin, xmax = self.rescale(xmin), self.rescale(xmax) 
     d = abs(xmax - xmin) 
     x = self.rescale(x) 
     s = self.pprint_val(x, d) 
     return s 

if __name__ == '__main__': 
    main() 

enter image description here

Cuestiones relacionadas