python图中奇怪的粗线?

时间:2017-01-25 18:55:31

标签: python-2.7 matplotlib

我在python中使用matplotlib.pyplot。考虑y轴是真实的值,称为"排名损失" x轴是迭代次数(1000)。然后我绘制每次迭代中算法的2次运行的平均排名损失。

有谁知道为什么我会得到这个奇怪的粗图而不是一条线?

非常感谢您提前

enter image description here

命令是:

    fig = plt.figure()
    fig.suptitle('Batch-GD', fontsize=20)
    plt.xlabel('Iteration', fontsize=18)
    plt.ylabel('Avg ranking loss', fontsize=16)
    plt.grid(True)
    plt.xlim(0, iter)
    plt.plot(avg_loss)
    fig.savefig('GD_with_ini.jpg')
    plt.show()

1 个答案:

答案 0 :(得分:3)

这里发生的事情可能是,你的线密度太高,以至于线条重叠的方式是显示平面而不是线本身。

如果我们采取例如10000点并使曲线以非常高的频率振荡,我们得到了类似的行为。放大显示实际上有一条线。

enter image description here

重现情节的代码:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1.inset_locator import inset_axes, mark_inset

x = np.linspace(0,1000,num=10000)
y = np.sin(x*100.)*x/5000.+np.exp(-x/60.)+np.sin(x/50.)*0.016

plt.plot(x,y)

###### show inset ####
ax = plt.gca()
axins = inset_axes(ax, 2,2, loc=1)
axins.plot(x,y)
axins.set_xlim(400, 410)
axins.set_ylim(-0.1, 0.17)
mark_inset(ax, axins, loc1=2, loc2=4, fc="none", ec="0.5")

plt.show()

然后,解决方案可以计算某种滚动平均值。 E.g:

def running_mean(x, N):
    cumsum = np.cumsum(np.insert(x, 0, 0)) 
    return (cumsum[N:] - cumsum[:-N]) / N 
N=300
cumsum = running_mean(y, N)
ax.plot(x[N//2:-N//2+1], cumsum, c="orange")
axins.plot(x[N//2:-N//2+1], cumsum, c="orange")

enter image description here