【问题标题】:Matplotlib adjust figure marginMatplotlib 调整图形边距
【发布时间】:2013-09-04 17:07:43
【问题描述】:

以下代码为我提供了一个在图上方和下方具有显着边距的图。我不知道如何消除明显的边距。 subplots_adjust 没有按预期工作。

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(range(10),range(10))
ax.set_aspect('equal')
plt.tight_layout()

tight_layout 消除了部分边距,但不是全部边距。

我想要的实际上是将纵横比设置为任何自定义值并同时消除空白。

更新:正如 Pierre H. 所说,关键是改变图形容器的大小。所以我的问题是:你能建议一种方法来将图形的大小适应具有任意纵横比的轴的大小吗?

换句话说,我首先在其上创建一个图形和一个轴,然后更改轴的大小(例如通过更改纵横比),这通常会使图形容器的一部分留空。在这个阶段,我们需要相应地改变图形的大小,以消除图形容器上的空白。

【问题讨论】:

  • 试试data = np.random.rand(15,20)
  • 您也可以使用fig.set_size_inches 设置图形的纵横比以匹配您的数据的纵横比
  • 如果您只是对保存的图感兴趣,请查看使用fig.savefig('whatever.ext', bbox_inches='tight')

标签: python matplotlib


【解决方案1】:

我刚刚发现了如何消除我的数字中的所有边距。我没有使用tight_layout(),而是使用了:

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(20,20))
ax = plt.subplot(111,aspect = 'equal')
plt.subplots_adjust(left=0, bottom=0, right=1, top=1, wspace=0, hspace=0)

希望这会有所帮助。

【讨论】:

  • 我遇到了一个奇怪的问题,在该问题中,tight_layout 大部分时间都可以正常工作,但是大约十分之一的地块最终会在使用tight_layout 时变为空白。这种方法为我提供了一个看似更可靠的选择。谢谢!
  • 这个解决方案也对我有用!!我的问题是这种情况下的底边距非常大:极坐标图,tight_layout()set_theta_zero_location(),带有非零偏移参数,以及set_thetamin()set_thetamax() 自定义值。
  • 谢谢,我试过了,看起来比tight_layout()好用
【解决方案2】:

【讨论】:

  • figure.set_tight_layout({"pad": .0}) 为我做了。
【解决方案3】:

我认为你需要的是,它对我很有效。

plt.axis('tight')

此命令将自动缩放轴以紧密适应数据。另请查看 Nuno Aniceto 的答案以获取自定义轴。文件位于https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.axis

请注意

plt.savefig(filename, bbox_inches='tight')

将有助于删除所有图形的空白,包括标签等,但不会删除轴内的空白。

【讨论】:

    【解决方案4】:

    绘制图表后,您可以通过以下方式轻松操作边距:

    plot_margin = 0.25
    
    x0, x1, y0, y1 = plt.axis()
    plt.axis((x0 - plot_margin,
              x1 + plot_margin,
              y0 - plot_margin,
              y1 + plot_margin))
    

    此示例可以更改为您想要的纵横比或根据您的实际需要更改边距。 在其他 stacktoverflow 帖子中,许多与边距相关的问题都可以使用这种更简单的方法。

    最好的问候。

    【讨论】:

    • Nuno... 非常有帮助。您简单易读的方法对我来说非常有用。我有这个小格式化函数,可以处理两个轴的范围不同的各种 x-y 图,所以我发现我有必要写,比如说,plot_marginx = 0.05 * (x1-x0) 并将其放在 plt.axis() 行之前。 ..当然对你来说也是如此。
    • 这与通过 ax.set_xlim() 设置 xlim 和 ylim 有什么不同吗?
    • 这个和plt.set_xlim()或者set_ylim()一样,就是改变显示数据的范围。这与改变轴的大小有很大不同
    • 这并没有真正回答 grg rsr 提到的问题!
    【解决方案5】:

    如果您想精确控制图形布局,您应该使用add_axes。例如。

    left = 0.05
    bottom = 0.05 
    width = 0.9
    height = 0.9
    ax = fig.add_axes([left, bottom, width, height])
    

    【讨论】:

      【解决方案6】:

      我认为subplot_adjust 调用在这里无关紧要,因为调整已被tight_layout 覆盖。无论如何,这只会改变图中 axes 的大小。

      正如 tcaswell 指出的那样,您需要更改 图形的大小。在创建时(我的提议如下)或之后,使用fig.set_size_inches。我在这里使用 figsize=(6,6) 参数创建一个纵横比为 1:1 的图形(当然 6 英寸是任意选择):

      import matplotlib.pyplot as plt
      import numpy as np
      
      fig = plt.figure(figsize=(6,6))
      ax = fig.add_subplot(111)
      ax.plot(range(10),range(10))
      ax.set_aspect('equal')
      plt.tight_layout()
      

      【讨论】:

      • 相信你已经非常接近答案了。您能否建议一种方法以任意纵横比将 图形大小 调整为 轴大小
      • 我看到了两种方法:(1)(更简单的)在创建时通过从数据猜测纵横比来设置图形大小。 plt.figaspect 是一个很好的帮手。 (2)(更复杂)使用 ax.get_position() 测量轴纵横比。后者需要更多计算,因为轴位置在 [0,1]x[0,1] 相对坐标空间中表示。
      【解决方案7】:

      你可以像这样使用: plt.subplots_adjust(wspace=1, hspace=0.5,left=0.1,top=0.9,right=0.9,bottom=0.1) 并删除 plt.savefig() 中的 item:bbox_inches='tight'。

      【讨论】: