Python 无法让次要网格线出现在 matplotlib 图中
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19940518/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Cannot get minor grid lines to appear in matplotlib figure
提问by therealjumbo
Ok so I have the code below for real-time graphing some data from an embedded device received over serial. It's not meant to be a production tool but rather an internal eng tool, hence it's not terribly user-friendly. The problem is that no matter what I do, I can't get minor grid lines to appear, even though here they are set to True, which=both
. I can do anything I want to the major grid lines but the minors won't appear. Any ideas? Here is the code:
好的,所以我有下面的代码,用于实时绘制来自通过串行接收的嵌入式设备的一些数据。它不是一个生产工具,而是一个内部工程工具,因此它不是非常用户友好。问题是无论我做什么,我都无法显示小网格线,即使它们在这里设置为True, which=both
. 我可以对主要网格线做任何我想做的事情,但未成年人不会出现。有任何想法吗?这是代码:
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)
Edit: fixed a bug in opening the serial port. Changed timeout=0
to timeout=None
.
编辑:修复了打开串口的错误。改timeout=0
到timeout=None
。
采纳答案by Joe Kington
Unfortunately, ax.grid
is a bit confusing in this regard. (This is a design bug / common gotcha.) It turns the minor grid on, but the minor ticks are still turned off.
不幸的是,ax.grid
在这方面有点令人困惑。(这是一个设计错误/常见问题。)它打开了次要网格,但次要刻度仍然关闭。
What you need to do is call plt.minorticks_on
or ax.minorticks_on
in addition to calling ax.grid(True, which='both')
.
您需要做的是调用plt.minorticks_on
或ax.minorticks_on
除了调用ax.grid(True, which='both')
.
回答by stephenb
You should use plt.minorticks_on()
.
你应该使用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()