Pyplot拒绝显示网格

时间:2019-03-25 20:36:50

标签: python python-3.x matplotlib

我有一个Python脚本,该脚本具有3个可绘制数据的函数。其中2个使用 ax.grid(b = True)显示网格线。但是,没有。即使我到处都发送了ax.grid(b = True)垃圾邮件……我肯定做错了什么,但是那又是什么呢?

def plotMSEProgress(times, bestScores, scores, xsplit=0, window=1):
    plot, ax = plt.subplots(figsize=(20,10), num=1)
    ax.grid(b=True, which='both')

    # plot = plt.figure(window)
    plt.ion()
    plt.minorticks_on()
    ax.grid(b=True, which='both')

    plt.show()

    plt.clf()

    if xsplit:
        plt.axvline(x=xsplit, color='g')

    plot = plt.plot_date(times, bestScores, '-', label="best score")
    plot = plt.setp(plot, color='y', linewidth=1.0)
    plot = plt.plot_date(times, scores, '-', label="score")
    plot = plt.setp(plot, color='b', linewidth=1.0)

    ax.grid(b=True, which='both')
    plt.xlabel('time')
    plt.ylabel('MSE')
    plt.suptitle('MSE over time', fontsize=16)
    plt.legend()
    ax.grid(b=True, which='both')
    plt.draw()
    ax.grid(b=True, which='both')
    plt.pause(0.001)        
    ax.grid(b=True, which='both')
    plt.plot()
    ax.grid(b=True, which='both')

也许与 plt.ion()有关?因为我没有其他显示网格的绘图函数。

我已经通过添加 plt.minorticks_on()来尝试thisthis,但遗憾的是没有用。

我明显缺少什么吗?还是还有其他隐藏的不兼容性?

按要求截取的屏幕截图: enter image description here

2 个答案:

答案 0 :(得分:1)

在函数内添加对plt.grid()的调用,并删除无关的代码:

import matplotlib.pyplot as plt
import datetime

def plotMSEProgress(times, bestScores, scores, xsplit=0, window=1):
    plot, ax = plt.subplots(figsize=(20,10), num=1)

    plt.ion()    
    plt.clf()

    if xsplit:
        plt.axvline(x=xsplit, color='g')

    plot = plt.plot_date(times, bestScores, '-', label="best score")
    plot = plt.setp(plot, color='y', linewidth=1.0)
    plot = plt.plot_date(times, scores, '-', label="score")
    plot = plt.setp(plot, color='b', linewidth=1.0)

    plt.minorticks_on()
    plt.grid(which='major')
    plt.grid(which='minor', linestyle = ':')

    plt.xlabel('time')
    plt.ylabel('MSE')
    plt.suptitle('MSE over time', fontsize=16)
    plt.legend(loc=2)
    plt.draw()
    plt.pause(0.001)

# Generate example data
base = datetime.datetime.today()
times = [base + datetime.timedelta(seconds=x) for x in range(0, 100)]
scores = np.random.rand(len(times))*30
bestScores = np.random.rand(len(times))*5

# Generate plot dynamically
for i in range(len(times)):
    plotMSEProgress(times[0:i], bestScores[0:i], scores[0:i], xsplit=0, window=1)

这段代码会生成图并动态更新它,同时始终显示网格线。

Plot with gridlines

答案 1 :(得分:1)

我认为您有一些不必要的代码,可以创建多个图。您拥有的第一个图是空的,但带有网格,而后面的图包含数据,但不包含网格。

尝试下面的代码。我评论了您的一些脚本并使其起作用。

def plotMSEProgress(times, bestScores, scores, xsplit=0, window=1):
    plot, ax = plt.subplots(figsize=(20,10), num=1)
    ax.grid(b=True, which='both')

    # plot = plt.figure(window)
    plt.ion()
    plt.minorticks_on()
    ax.grid(b=True, which='both')

#     plt.show()

#     plt.clf()

    if xsplit:
        plt.axvline(x=xsplit, color='g')

    plot = plt.plot(times, bestScores, '-', label="best score") # you can change it back to plot_date
    plot = plt.setp(plot, color='y', linewidth=1.0)
    plot = plt.plot(times, scores, '-', label="score") # you can change it back to plot_date
    plot = plt.setp(plot, color='b', linewidth=1.0)

    ax.grid(b=True, which='both')
    plt.xlabel('time')
    plt.ylabel('MSE')
    plt.suptitle('MSE over time', fontsize=16)
    plt.legend()
    ax.grid(b=True, which='both')
    plt.draw()
    ax.grid(b=True, which='both')
    plt.pause(0.001)        
    ax.grid(b=True, which='both')
#     plt.plot()
    ax.grid(b=True, which='both')

times = list(range(0,100))
bestScores = list(range(100,200))
scores = list(range(150,250))
xsplit=0
window=1
plotMSEProgress(times, bestScores, scores, xsplit=0, window=1)

enter image description here