完全从轮廓图中删除坐标轴

3

我正在尝试创建一张没有坐标轴的栅格数据等值线图。我成功地创建了等值线图,但我无法完全删除坐标轴。我可以使用 plt.axis('off') 命令关闭它们,但是坐标轴周围的空白区域仍然存在。

我的操作步骤如下:

cnt = plt.contour(my_data)
plt.clabel(cnt, inline=1, fontsize=10)
plt.axis('off')

编辑 我的输出方式

plt.savefig(image_path, transparent=False, bbox_inches='tight', pad_inches=0)

结果: 在plt.axis('off')之前 enter image description hereplt.axis('off')之后 There is still whitespaces on the left and bottom edges of the picture 我遇到了与imshow相同的问题,但我已经在这里找到了解决方法here,然而,相同的技术无法用于轮廓。
那么,如何绘制没有轴和任何留下的白色空格的轮廓?
编辑 因此,我设法确定问题不在代码的'plt.axis('off')'部分。该行实际上完全删除了轴,当我调用plt.show()时它是可见的,但是当我尝试使用'plt.savefig()'保存图形时,我会得到不想要的白色空格。为什么会这样?
我的代码和输出:
cnt = plt.contour(my_data)
plt.clabel(cnt, inline=1, fontsize=10)
plt.axis('off')
# no whitespaces
plt.show()
# whitespaces are present
plt.savefig(image_path, transparent=False, bbox_inches='tight', pad_inches=0)

可能的解决方案吗!? 我已经找到了一种方法,可以通过以下方式使我的图像接近我想要的效果:
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
plt.contour(data)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.axis('off')
plt.savefig(image_path, transparent=False, bbox_inches=extent, pad_inches=0)

然而我无法改变绘图的纵横比。我认为我没有充分理解这个解决方案。


仅供我理解:您所指的空格是指哪些留下来的?您是指边框处的白色填充吗? - jkalden
我在问题中发布了不透明的图片。通过使用任何图像浏览器打开它们,您可以看到我所说的空白处。但是有可能图像具有像我链接的imshow问题中那样的小填充。对我来说,最大的问题是仍然存在于轴标签和刻度线所在位置的大型空白处。 - Domagoj
在显示图像之前(或者是交互模式下的结束处)尝试使用plt.tight_layout(),也许可以解决您的问题。 - Imanol Luengo
@iluengo - tight_layout 只会改变轴的大小,没有其他影响。DomagojHack 遇到的问题是因为在保存时,savefig 会覆盖图形的面颜色。 - Joe Kington
1
@JoeKington - 实际上,他似乎也想使用tight_layout();透明度的问题也在于发布时不清楚正在发生什么。 - David Manheim
显示剩余2条评论
1个回答

2
这实际上是由于savefig的默认设置。图形可以具有透明背景(例如尝试fig.patch.set(facecolor='none'); fig.canvas.print_png),但在调用plt.savefig时被覆盖。
如果您想要透明背景,需要在调用savefig时指定transparent=True。否则,它将覆盖图形的当前背景颜色并将其设置为不透明的白色。
有关更多详细信息,请查看savefig文档
例如:
import numpy as np
import matplotlib.pyplot as plt

data = np.random.random((5, 5))

fig, ax = plt.subplots()
cnt = ax.contour(data)
ax.clabel(cnt)
ax.axis('off')

fig.savefig('test.png', bbox_inches='tight', transparent=True)

enter image description here

当然,这在此页面上看起来是一样的,但是如果您在图像查看器中打开它,您会注意到它具有透明的背景:

enter image description here


编辑

我可能误解了你的意思。如果您希望等高线图占据整个图形而不留下侧面的刻度标签等空间,最好一开始就定义好该绘图。

例如(请注意,这适用于任何类型的绘图,而不仅仅是等高线绘图):

import numpy as np
import matplotlib.pyplot as plt

data = np.random.random((5, 5))

fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
cnt = ax.contour(data)
ax.clabel(cnt)
ax.axis('off')

plt.show()

enter image description here


如果您仍然遇到问题,可能是因为您正在使用fig.savefig(..., bbox_inches='tight')。 这特别要求保存的图像中必须包括刻度标签,即使它们不可见并且超出了图形的边界。

尝试类似于以下内容:

import numpy as np
import matplotlib.pyplot as plt

data = np.random.random((5, 5))

fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
cnt = ax.contour(data)
ax.clabel(cnt)
ax.axis('off')

fig.savefig('test.png')

起初,您误解了问题。我知道如何创建图像的透明和不透明版本。我提到透明度是因为在轮廓图上,透明图像中的空白更难以发现。因此,这个答案的第一部分并不是困扰我的地方。然而,在尝试了您编辑后的答案之后,我得到了与我的第一种方法相同的结果。仍然存在大量空白的图像,如果我不调用“ax.axis(“off”)”,则会出现轴标签和刻度线的位置。我确定使用的“plt.savefig”存在问题。我将进一步编辑我的问题。 - Domagoj
1
@DomagojHack - 你是否使用 fig.savefig(..., bbox_inches='tight')?如果是,请删除 bbox_inches='tight' 并保留将坐标轴定义为填充整个图形的部分 (fig.add_axes([0, 0, 1, 1]))。bbox_inches='tight'会强制 savefig 包括轴刻度,即使它们在图形边界之外且不可见。 - Joe Kington
谢谢!那就是我现在看到的问题。 - Domagoj

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