调整图形边距

53
以下代码给我一个在图形上方和下方有显著边距的图。我不知道如何消除这些明显的边距。`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) - joaquin
1
你也可以使用 fig.set_size_inches 来设置图形的纵横比以匹配数据的纵横比。 - tacaswell
12
如果您只对保存的图形感兴趣,可以尝试使用 fig.savefig('whatever.ext', bbox_inches='tight') - Joe Kington
1
使用 savefigbbox_inches='tight' 仍然会在图形周围留下一些填充。使用 fig.savefig('whatever.ext', bbox_inches='tight', pad_inches=0) 来移除这些填充。 - Rens Baardman
7个回答

88

我刚刚发现了如何从我的图形中消除所有边距。 我没有使用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)

希望这可以帮助到你。


3
我遇到了一个奇怪的问题,在使用tight_layout时,大多数时间它都有效,但10个图中有1个图只是空白。这种方法给了我一个看起来更可靠的替代方案。谢谢! - Dave C
这个解决方案对我也起作用了!我的问题是在极坐标图、tight_layout()、带有非零偏移参数的set_theta_zero_location()以及自定义值的set_thetamin()set_thetamax()情况下,底部边距非常大。 - ForeverLearning
谢谢,我试过了,看起来它的效果比tight_layout()更好。 - timanix

29

绘制图表后,您可以轻松地以这种方式操作边距:

plot_margin = 0.25

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

这个示例可以根据您想要的宽高比进行更改,或者根据实际需要更改边距。

在其他stackoverflow帖子中,许多与边距相关的问题都可以使用这种更简单的方法。

最好的问候。


2
Nuno...非常有帮助。您简单易懂的方法对我非常有效。我有一个小格式化函数,可以与具有不同轴范围的各种x-y图形一起使用,因此我发现有必要编写例如plot_marginx = 0.05 * (x1-x0)并将其放在plt.axis()行之前...当然也适用于y。 - Mike O'Connor
这与通过ax.set_xlim()设置xlim和ylim有什么不同吗? - EL_DON
5
这与 plt.set_xlim()set_ylim() 的作用相同,即更改显示数据的范围。这与更改轴的大小非常不同。 - grg rsr
这并没有真正回答问题,就像grg rsr所提到的那样! - meow

21

7
figure.set_tight_layout({"pad": .0}) 对我很有帮助。 - vobject

9

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

plt.axis('tight')

这个命令将自动缩放轴以紧密适应数据。此外,可以查看Nuno Aniceto的答案来定制轴。文档在https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.axis中。请注意:
plt.savefig(filename, bbox_inches='tight')

将帮助去除所有图形(包括标签等)的空白,但不会去除轴内部的空白。


7

如果你想精确控制图形的布局,可以使用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覆盖。不管怎样,这只会改变图内的大小。

正如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()

我相信你非常接近答案了。你能否提供一种方法来适应任意长宽比的坐标轴大小到图形的大小? - wdg
1
我看到两种方法:(1)(更简单的)通过猜测从数据中推断纵横比在创建时设置图形大小。plt.figaspect是一个好的辅助工具。 (2)(更复杂的)使用ax.get_position()来测量轴的纵横比。后者需要进行一些额外的计算,因为轴位置是在[0,1]x[0,1]相对坐标空间中表示的。 - Pierre H.

1

你可以像这样使用:

plt.subplots_adjust(wspace=1,hspace=0.5,left=0.1,top=0.9,right=0.9,bottom=0.1)

并且在plt.savefig()中删除bbox_inches='tight'这一项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接