【问题标题】:Matplotlib doesn't display correctly in Visual Studio CodeMatplotlib 在 Visual Studio Code 中无法正确显示
【发布时间】:2021-06-25 16:35:02
【问题描述】:

我正在尝试在 Visual Studio 代码上使用 Matplotlib 和 Pandas 创建一个由 5 个子图组成的图,这些子图由简单的折线图组成。但是,由于某种原因,即使我将图形做得很大,图像也总是看起来很小并且结块。我尝试使用 subplots_adjust 修改图形之间的空间,但这并没有改变任何东西。

这是我的代码

ax1 = plt.subplot(1, 5, 1)
ax1 = plt.plot(returns["MSFT"])
plt.xlabel("Date")
plt.ylabel("Daily MSFT Returns")
plt.title("MSFT Returns Over Time")

ax2 = plt.subplot(1, 5, 2)
ax2 = plt.plot(returns["AMZN"])
plt.xlabel("Date")
plt.ylabel("Daily AMZN Returns")
plt.title("AMZN Returns Over Time")

ax3 = plt.subplot(1, 5, 3)
ax3 = plt.plot(returns["AAPL"])
plt.xlabel("Date")
plt.ylabel("Daily AAPL Returns")
plt.title("AAPL Returns Over Time")

ax4 = plt.subplot(1, 5, 4)
ax4 = plt.plot(returns["GOOG"])
plt.xlabel("Date")
plt.ylabel("Daily GOOG Returns")
plt.title("GOOG Returns Over Time")

ax5 = plt.subplot(1, 5, 5)
ax5 = plt.plot(returns["FB"])
plt.xlabel("Date")
plt.ylabel("Daily FB Returns")
plt.title("FB Returns Over Time")

plt.figure(figsize=(100, 100))
plt.subplots_adjust(wspace = 10)
plt.show()

figure displayed

【问题讨论】:

    标签: visual-studio matplotlib visual-studio-code


    【解决方案1】:

    一些可能有帮助的建议 - 首先 matplotlib 有一个函数“tight_layout”,它可以帮助合理地设置空白并减少刻度标签的数量。 documentation。要使用它,只需在 plt.show() 之前调用 plt.tight_layout()

    但这并不能解决您的图形上有大量文字的问题。您可以尝试通过使用“股票随时间回报”as shown here 的副标题来保存文本,并简单地通过子图标题的股票名称引用每个图。

    如果不同风格的情节可以做得更好,这也可能值得考虑。如果收益在同一时间段内具有相似的幅度,则将它们作为同一轴上的不同颜色的线可能更有意义,并带有用于识别股票的图例

    【讨论】:

    • 您好,非常感谢您的回复!主要问题是图形显示得非常拥挤,并且出于某种原因,无论我尝试使它有多大,它总是保持相同的大小。我认为这可能是视觉工作室代码本身的设置,但我无法弄清楚。我实际上正在学习如何编码,因此我要尝试 5 个子图。
    • 啊,好吧,你在使用交互式 ipython 终端吗?可能值得在普通终端中运行脚本以使绘图显示在新窗口中。然后,您可以调整窗口大小并在 GUI 中重新应用 tight_layout(在配置子图菜单下)
    • 祝你学习顺利 :) matplotlib 一开始可能会让人困惑!
    • 谢谢!我会试试你的建议。我正在通过代码学院学习,在那里我的显示没有同样的问题,因此我认为这是因为 Visual Studio Code 中的一些设置。您是否知道任何其他类似于 Visual Studio Code 的程序?
    • 不客气 :) Atom、Spyder 是其他 IDE。我使用 VSCode,但通过在集成终端中运行脚本而不是交互式 ipython 来解决这个问题。它会在新窗口中弹出图形,并且不会将其限制为固定大小
    【解决方案2】:

    更新:正如BigBen 提到的,您可以通过循环进一步简化。例如,这里我们将所有子图轴放在axes 中,将公司名称放在names 中,然后压缩并迭代:

    fix, axes = plt.subplots(nrows=1, ncols=5, figsize=(20, 5))
    names = ['MSFT', 'AMZN', 'AAPL', 'GOOG', 'FB']
    
    for ax, name in zip(axes, names):
        ax.plot(returns[name])
        ax.set_ylabel(f'Daily {name} Returns')
        ax.set_title(f'{name} Returns Over Time')
    

    通常,使用plt.subplots() 和figsize 首先创建子图轴ax1、...、ax5 会更容易。然后对那些预制的轴句柄进行操作,例如 ax1.plot() 而不是 plt.plot()、ax1.set_xlabel() 而不是 plt.xlabel() 等。

    # first create ax1~ax5
    fig, (ax1,ax2,ax3,ax4,ax5) = plt.subplots(nrows=1, ncols=5, figsize=(20, 5))
    
    ax1.plot(returns["MSFT"])               # not plt.plot(...)
    ax1.set_xlabel("Date")                  # not plt.xlabel(...)
    ax1.set_ylabel("Daily MSFT Returns")    # not plt.ylabel(...)
    ax1.set_title("MSFT Returns Over Time") # not plt.title(...)
    
    ax2.plot(returns["AMZN"])
    ax2.set_xlabel("Date")
    ax2.set_ylabel("Daily AMZN Returns")
    ax2.set_title("AMZN Returns Over Time")
    
    ax3.plot(returns["AAPL"])
    ax3.set_xlabel("Date")
    ax3.set_ylabel("Daily AAPL Returns")
    ax3.set_title("AAPL Returns Over Time")
    
    ax4.plot(returns["GOOG"])
    ax4.set_xlabel("Date")
    ax4.set_ylabel("Daily GOOG Returns")
    ax4.set_title("GOOG Returns Over Time")
    
    ax5.plot(returns["FB"])
    ax5.set_xlabel("Date")
    ax5.set_ylabel("Daily FB Returns")
    ax5.set_title("FB Returns Over Time")
    

    【讨论】:

    • 感谢这显示它们现在很好!祝您有美好的一天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 2022-09-25
    • 1970-01-01
    • 2022-07-15
    • 2022-11-18
    • 2020-02-13
    • 2018-09-25
    相关资源
    最近更新 更多