子情节搞乱了我的阴谋

时间:2016-08-27 14:32:12

标签: python matplotlib stacked-area-chart

我有以下绘图功能,可以保存随机行走输入(随机漫步应该模仿股票和债券组合,在给定特定输入的情况下,彼此之间重新平衡,曝光应该显示暴露于股票投资组合)

def stock_save_img_run(k):
    stock_vals = pd.read_csv('stock_vals_run_' + str(k) + '.csv', sep=';', encoding='utf-8-sig')
    plt.subplot(2, 1, 1)
    plt.plot(stock_vals['date'], stock_vals['stock_val'], color='#191970')
    plt.plot(stock_vals['date'], stock_vals['protected_amt'], color='#191970', ls='dashed')
    plt.stackplot(stock_vals['date'], stock_vals['exposure'] * stock_vals['stock_val'], (1 - stock_vals['exposure']) * stock_vals['stock_val'], color=('gray'), colors=('gray', 'silver'))
    plt.subplot(2, 1, 2)
    plt.plot(stock_vals['date'], stock_vals['exposure'], color='#191970', lw='0.5')
    plt.ylabel('Exposure (in %)')
    plt.savefig('chart_' + str(k) + '.png')
    plt.show()
    plt.cla()
    del stock_vals

常规输出应如下所示: correct output

这适用于第一次运行。如果我再次运行脚本,输出将如下所示: incorrect output

为了使情节再次看起来正常,我必须取消注释这一行:
##plt.plot(stock_vals['date'], stock_vals['exposure'], color='#191970', lw='0.5')

您可以想象,对于此特定运行,输出将如下所示: third run to reset

如您所见,顶部的图表再次显示正常。当我再次运行它(第四次运行)时,两个图表看起来都应该看起来像。第五轮将再次摧毁一切 - 冲洗并重复。

鉴于我知道解决问题的方法,我很惊讶为什么会这样。

1 个答案:

答案 0 :(得分:2)

在单独的Axes个实例上获取句柄可能是朝着有用的方向迈出的一步:

def stock_save_img_run(k):
    stock_vals = pd.read_csv('stock_vals_run_' + str(k) + '.csv', sep=';', encoding='utf-8-sig')
    fig, (top_axes, bottom_axes) = plt.subplots(2, 1)
    top_axes.plot(stock_vals['date'], stock_vals['stock_val'], color='#191970')
    top_axes.plot(stock_vals['date'], stock_vals['protected_amt'], color='#191970', ls='dashed')
    top_axes.stackplot(stock_vals['date'], stock_vals['exposure'] * stock_vals['stock_val'], 
                       (1 - stock_vals['exposure']) * stock_vals['stock_val'], color=('gray'),
                       colors=('gray', 'silver'))
    bottom_axes.plot(stock_vals['date'], stock_vals['exposure'], color='#191970', lw='0.5')
    bottom_axes.set_ylabel('Exposure (in %)')
    plt.savefig('chart_' + str(k) + '.png')
    plt.show()
    top_axes.cla()
    bottom_axes.cla()
    del stock_vals