完全从等高线图中删除轴

时间:2014-12-26 13:59:06

标签: python matplotlib plot contour

我正在尝试创建栅格数据的无轴等高线图。我设法创建了轮廓图但是我无法完全移除轴。我可以用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 here plt.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)

但是我无法改变情节的宽高比。我认为我不能完全理解这个解决方案。

1 个答案:

答案 0 :(得分:2)

这实际上是由于savefig的默认值。该图可以具有透明背景(例如,尝试fig.patch.set(facecolor='none'); fig.canvas.print_png),但是当您调用plt.savefig时,它会被覆盖。

如果您想要透明背景,则需要在致电transparent=True时指定savefig。否则,它将覆盖图形的当前背景颜色并将其设置为不透明白色。

有关详细信息,请查看documentation for 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')