Estoy usando matplotlib 1.2.x y Python 2.6.5 en Ubuntu 10.0.4. Estoy tratando de crear una sola trama que consta de una trama superior y una trama inferior.matplotlib: Creando dos subparcelas (apiladas) con eje X COMPARTIDO pero con valores SEPARADOS del eje Y
El eje X es la fecha de la serie temporal. El gráfico superior contiene un gráfico de velas de los datos, y el gráfico inferior debe consistir en un gráfico de tipo barra, con su propio eje Y (también a la izquierda, igual que el gráfico superior). Estas dos parcelas NO deben OVERLAP.
Aquí hay un fragmento de lo que he hecho hasta ahora.
datafile = r'/var/tmp/trz12.csv'
r = mlab.csv2rec(datafile, delimiter=',', names=('dt', 'op', 'hi', 'lo', 'cl', 'vol', 'oi'))
mask = (r["dt"] >= datetime.date(startdate)) & (r["dt"] <= datetime.date(enddate))
selected = r[mask]
plotdata = zip(date2num(selected['dt']), selected['op'], selected['cl'], selected['hi'], selected['lo'], selected['vol'], selected['oi'])
# Setup charting
mondays = WeekdayLocator(MONDAY) # major ticks on the mondays
alldays = DayLocator() # minor ticks on the days
weekFormatter = DateFormatter('%b %d') # Eg, Jan 12
dayFormatter = DateFormatter('%d') # Eg, 12
monthFormatter = DateFormatter('%b %y')
# every Nth month
months = MonthLocator(range(1,13), bymonthday=1, interval=1)
fig = pylab.figure()
fig.subplots_adjust(bottom=0.1)
ax = fig.add_subplot(111)
ax.xaxis.set_major_locator(months)#mondays
ax.xaxis.set_major_formatter(monthFormatter) #weekFormatter
ax.format_xdata = mdates.DateFormatter('%Y-%m-%d')
ax.format_ydata = price
ax.grid(True)
candlestick(ax, plotdata, width=0.5, colorup='g', colordown='r', alpha=0.85)
ax.xaxis_date()
ax.autoscale_view()
pylab.setp(pylab.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
# Add volume data
# Note: the code below OVERWRITES the bottom part of the first plot
# it should be plotted UNDERNEATH the first plot - but somehow, that's not happening
fig.subplots_adjust(hspace=0.15)
ay = fig.add_subplot(212)
volumes = [ x[-2] for x in plotdata]
ay.bar(range(len(plotdata)), volumes, 0.05)
pylab.show()
que han logrado mostrar las dos parcelas utilizando el código anterior, sin embargo, hay dos problemas con la trama de fondo:
completamente sobrescribe la parte inferior de la primera (arriba) la trama, casi como si la segunda trama se basara en el mismo "lienzo" que la primera trama, no puedo ver dónde y por qué está sucediendo eso.
SOBRESCRIBE el eje X existente con su propio índice, los valores del eje X (fechas) deben COMPARTIR entre los dos trazados.
¿Qué estoy haciendo mal en mi código ?. ¿Puede alguien detectar qué está causando que la segunda trama (inferior) sobrescriba la primera trama (superior) y cómo puedo solucionarla?
Aquí está una captura de pantalla de la trama creada por el código anterior:
[[Editar]]
Después de modificar el código como lo sugiere hwlau, este es el nuevo trama. Es mejor que la primera en que las dos parcelas están separados, sin embargo, las siguientes cuestiones siguen:
El eje X debe ser compartida por las dos parcelas (es decir, el eje X se debe mostrar sólo para el segundo [ parte inferior] parcela)
valores de la Y para la segunda trama parecen ser formmated incorrectamente
Creo que estos tema Sin embargo, mi matplotlib fu no es muy bueno en este momento, ya que recientemente comencé a programar con matplotlib. Cualquier ayuda será muy apreciada.
Las propiedades 'sharex' y' sharey' en subtramas son realmente útiles, gracias por publicarlas. (Puede ser mucho mejor que establecer límites comunes leyendo de uno y configurando el otro: al inspeccionar los resultados mediante el acercamiento interactivo, ambas/subtramas se acercarán si se comparten). – Bonlenfum
'sharex = first_axis_instance' esto es un' ejes 'instancia, ¿correcto? –