No se pueden obtener líneas de cuadrícula secundarias para aparecer en la figura matplotlib

Ok, tengo el siguiente código para graficar en tiempo real algunos datos de un dispositivo integrado recibido en serie. No es una herramienta de producción, sino una herramienta de ingeniería interna, por lo que no es muy fácil de usar. El problema es que no importa lo que haga, no puedo hacer que aparezcan líneas de cuadrícula menores, aunque aquí están configuradas en True, which=both . Puedo hacer lo que quiera con las líneas de cuadrícula principales, pero los menores no aparecerán. ¿Algunas ideas? Aquí está el código:

 import numpy as np from matplotlib import pyplot as plt from matplotlib import animation import serial SERIAL_PORT_NUM=9 ...a bunch of constants... #windows starts serial port numbers at 1, python starts at 0 SERIAL_PORT_NUM = SERIAL_PORT_NUM - 1 """ Open the serial port """ ser =serial.Serial(port=SERIAL_PORT_NUM,baudrate=115200,bytesize=8,parity='N',stopbits=1,timeout=None,xonxoff=0,rtscts=0) # First set up the figure, the axis, and the plot element we want to animate raw_adc_fig = plt.figure() raw_adc_ax = plt.axes(xlim=(0, 200), ylim=(0, 2047)) raw_adc_ax.grid(True, which='both') raw_adc_fig.suptitle("Raw ADC data") plt.ylabel("ADC values (hex)") plt.xlabel("time (sec)") raw_adc_line, = raw_adc_ax.plot([], [], lw=2) def read_serial(serial_port): tmp = '' same_line = True while same_line: tmp += serial_port.read(1) if tmp != '': if tmp[-1] == '*': same_line = False tmp = tmp.rstrip() tmp = tmp.lstrip() return tmp def process_serial(input_data): output_data = 0 intermediate_data = input_data[A_TYPE_START_POS:A_TYPE_STOP_POS + 1] if( intermediate_data != ''): output_data = int(intermediate_data , 16 ) else: print "bad data" output_data = -100 return output_data def get_sound_value(serial_port): cur_line = '' get_next_line = True # read in the next line until a sound packet of type A is found while( get_next_line ): cur_line = read_serial(serial_port) if( (cur_line != '') and (cur_line[0:3] == ROUTER_SOUND_DATA) and (len(cur_line) == D_TYPE_STOP_POS + 2) ): get_next_line = False sound_value = process_serial(cur_line) return sound_value # initialization function: plot the background of each frame def raw_adc_init(): raw_adc_line.set_data([], []) return raw_adc_line, # animation function. This is called sequentially def raw_adc_animate(i): sound_data_list.append( get_sound_value(ser) ) y = sound_data_list if( len(y) == 190 ): del y[0] x = np.linspace(0, len(y), len(y)) raw_adc_line.set_data(x, y) return raw_adc_line, # call the animator. blit=True means only re-draw the parts that have changed. raw_adc_anim = animation.FuncAnimation(raw_adc_fig, raw_adc_animate, init_func=raw_adc_init, frames=200, interval=1000, blit=True) 

Editar: corrigió un error al abrir el puerto serie. timeout=0 modificado timeout=0 a timeout=None de timeout=None .

Desafortunadamente, ax.grid es un poco confuso a este respecto. (Este es un error de diseño / error común). Enciende la cuadrícula menor, pero las marcas menores aún están apagadas.

Lo que debe hacer es llamar a plt.minorticks_on o ax.minorticks_on además de llamar a ax.grid(True, which='both') .

Debe utilizar plt.minorticks_on() .

 import matplotlib.pyplot as plt import numpy as np fig = plt.figure(1) ax = fig.add_subplot(111) x = np.linspace(0,10,41) y = np.sin(x) plt.plot(x,y) plt.grid(b=True, which='major', color='k', linestyle='-') plt.grid(b=True, which='minor', color='r', linestyle='-', alpha=0.2) plt.minorticks_on() plt.show()