我正在尝试创建栅格数据的无轴等高线图。我设法创建了轮廓图但是我无法完全移除轴。我可以用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)
但是我无法改变情节的宽高比。我认为我不能完全理解这个解决方案。
答案 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)
当然,这个页面看起来相同,但是如果你在图片浏览器中打开它,你会注意到它有一个合适的透明背景:
修改强>:
我可能误解了你的问题。如果您希望轮廓图占据整个图形,侧面没有剩余空间用于刻度标签等,则最容易定义以此开头的图形。
例如(请注意,这适用于任何类型的绘图,而不仅仅是轮廓绘制):
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')