【问题标题】:Subplots mess with my plot子情节弄乱了我的情节
【发布时间】:2016-08-27 14:32:12
【问题描述】:

我有以下绘图函数来保存随机游走输入股票投资组合):

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

常规输出应如下所示:

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

为了让剧情恢复正常,我必须取消注释这一行:
##plt.plot(stock_vals['date'], stock_vals['exposure'], color='#191970', lw='0.5')

正如您可以想象的那样,此特定运行的输出将如下所示:

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

鉴于我知道解决问题的解决方法,我对为什么会发生这种情况感到惊讶。

【问题讨论】:

  • 您确定需要plt.stackplot 命令中的第一个color=('gray') 吗?
  • plt.* 函数在“当前轴”上运行。除非您在终端中输入命令,否则最好保留对 Axes 对象的引用并直接对其进行操作。

标签: python matplotlib stacked-area-chart


【解决方案1】:

获取独立 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

【讨论】:

  • 它引发错误/警告:UserWarning: sharex argument to subplots() was an integer. Did you intend to use subplot() (without 's')? Traceback (most recent call last): [...] ValueError: sharex [1] must be one of ['all', 'row', 'col', 'none'] 所以它没有通过。
  • 抱歉,应该是 plt.subplots(2, 1) 而不是 plt.subplots(2, 1, 1)。我已经编辑了我最初的答案来纠正这个问题。
  • 我仍然收到错误:Traceback (most recent call last): fig, top_axes, bottom_axes = plt.subplots(2, 1) ValueError: not enough values to unpack (expected 3, got 2)
  • plt.subplots 返回 Figure 实例,然后返回一个元组,其中包含代表各个子图的每个 Axes 实例。因此,top_axesbottom_axes 周围应该有括号,就像现在一样。现在怎么样了?
  • 它现在似乎正在工作,但对我来说也是如此。无论如何,谢谢,我会报告的。在我进行更多测试之前不会将其标记为正确,但同时会投票给你。一件小事:del stock_vals 在最后一行,而不是stock_cals
猜你喜欢
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 2018-03-30
  • 2018-02-21
  • 2021-11-03
  • 1970-01-01
相关资源
最近更新 更多