You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib调用plt.show()时弹出空白窗口问题求助

解决Matplotlib绘制股票图表时弹出空白窗口的问题

问题根源

你遇到的额外空白窗口,是因为开头调用的plt.clf()和plt.cla()会强制清空当前活跃画布——如果此时还没有手动创建画布,Matplotlib会自动生成一个空白画布,这就是多余窗口的来源;再加上后续手动创建新画布plt.figure(),就会出现两个窗口。

解决方案

移除不必要的全局状态操作,全程使用Matplotlib的面向对象接口,避免依赖pyplot的全局状态:

def plot(self):
    colors = Colors()
    data = self.getStockData()
    if data.empty:
        return
    data.index = [TimeData.fromTimestamp(x) for x in data.index]
    current, previous = data.iloc[-1, 1], data.iloc[0, 1]
    percentage = (current / previous - 1) * 100
    color = colors.decideColorPct(percentage)
    
    # 直接创建画布与轴对象,统一用面向对象方式操作
    fig, ax = plt.subplots(edgecolor=colors.NEUTRAL_COLOR)
    fig.patch.set_facecolor(colors.BACKGROUND_COLOR)
    
    # 所有绘图操作通过ax对象执行
    ax.plot(data.close, color=color)
    ax.set_title(self.__str2__(), color=colors.NEUTRAL_COLOR)
    ax.set_ylabel("Share price in $", color=colors.NEUTRAL_COLOR)
    ax.set_xlabel("Date", color=colors.NEUTRAL_COLOR)
    
    ax.xaxis.set_major_formatter(plt_dates.DateFormatter('%Y/%m/%d %H:%M'))
    ax.set_xticks([data.index[0], data.index[-1]])
    ax.set_facecolor(colors.BACKGROUND_COLOR)
    ax.tick_params(color=colors.NEUTRAL_COLOR, labelcolor=colors.NEUTRAL_COLOR)
    for spine in ax.spines.values():
        spine.set_edgecolor(colors.NEUTRAL_COLOR)
    
    ax.yaxis.grid(True, color=colors.NEUTRAL_COLOR, linestyle=(0, (5, 10)), linewidth=.5)
    plt.show()

修改说明

  • 删掉开头的plt.clf()和plt.cla(),不再触发Matplotlib自动创建空白画布
  • 用plt.subplots()一次性创建画布(fig)和轴(ax)对象,替代先建画布再获取轴的方式,避免全局状态冲突
  • 所有绘图相关设置(标题、坐标轴、网格等)都通过ax对象调用,彻底脱离pyplot的全局状态管理

内容的提问来源于stack exchange,提问作者lypsoty112

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:18:50