【问题标题】:Completely removing axes from contour plot从等高线图中完全删除轴
【发布时间】:2015-02-23 19:46:24
【问题描述】:

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

我在 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)

但是我不能改变情节的纵横比。我认为我没有完全理解这个解决方案。

【问题讨论】:

  • 只是为了我的理解:你的意思是留下哪些空格?你的意思是边界处的白色填充?
  • 我发布了带有问题的不透明图片。在它们上(通过使用任何图像浏览器打开),您可以看到我正在谈论的空格。但是,图像有可能像我链接的 imshow 问题中那样有一个小的填充。对我来说,最大的问题是大的空白仍然在轴标签和刻度的地方。
  • 可能plt.tight_layout()plt.show() 之前(或者在交互模式开启的情况下最后)解决您的问题?
  • @iluengo - tight_layout 更改轴的大小。而已。 DomagojHack 遇到的问题是因为savefig 在保存时会覆盖图形的面色。
  • @JoeKington - 实际上听起来他也想使用tight_layout();透明点还在于它发布时尚不清楚发生了什么。

标签: python matplotlib plot contour


【解决方案1】:

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

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

查看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)

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


编辑

我可能误解了你在问什么。如果您希望等高线图占据整个图形,而侧面没有刻度标签等空间,则最容易以这种方式开始定义图。

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

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


如果您仍然遇到问题,可能是因为您使用的是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”有问题。我会更多地编辑我的 Q。
  • @DomagojHack - 你在使用fig.savefig(..., bbox_inches='tight')吗?如果是这样,请删除 bbox_inches='tight' 并保留将轴定义为填充整个图形的部分 (fig.add_axes([0, 0, 1, 1]))。 bbox_inches='tight' 将强制 savefig 包含坐标轴刻度,即使它们在图形边界之外且不可见。
  • 谢谢!这就是我现在看到的问题。
猜你喜欢
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多