matplotlib 关闭子图中的轴

tnkciper  于 2023-04-21  发布在  其他
关注(0)|答案(3)|浏览(145)

我有以下代码:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import matplotlib.cm as cm

img = mpimg.imread("lena.jpg")

f, axarr = plt.subplots(2, 2)
axarr[0,0].imshow(img, cmap = cm.Greys_r)
axarr[0,0].set_title("Rank = 512")

rank = 128
new_img = prune_matrix(rank, img)
axarr[0,1].imshow(new_img, cmap = cm.Greys_r)
axarr[0,1].set_title("Rank = %s" %rank)

rank = 32
new_img = prune_matrix(rank, img)
axarr[1,0].imshow(new_img, cmap = cm.Greys_r)
axarr[1,0].set_title("Rank = %s" %rank)

rank = 16
new_img = prune_matrix(rank, img)
axarr[1,1].imshow(new_img, cmap = cm.Greys_r)
axarr[1,1].set_title("Rank = %s" %rank)

plt.show()

然而,由于轴上的值,结果非常难看:

如何同时关闭所有子图的轴值?

yks3o0rb

yks3o0rb1#

您可以按照Veedrac的评论(链接到here)中的建议进行一个小修改来关闭轴。
而不是使用plt.axis('off'),你应该使用ax.axis('off'),其中ax是一个matplotlib.axes对象。要为你的代码做到这一点,你只需要为你的每个子图添加axarr[0,0].axis('off')等等。
下面的代码显示了结果(我已经删除了prune_matrix部分,因为我没有访问该函数的权限,**将来请提交完整的工作代码。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import matplotlib.cm as cm

img = mpimg.imread("stewie.jpg")

f, axarr = plt.subplots(2, 2)
axarr[0,0].imshow(img, cmap = cm.Greys_r)
axarr[0,0].set_title("Rank = 512")
axarr[0,0].axis('off')

axarr[0,1].imshow(img, cmap = cm.Greys_r)
axarr[0,1].set_title("Rank = %s" % 128)
axarr[0,1].axis('off')

axarr[1,0].imshow(img, cmap = cm.Greys_r)
axarr[1,0].set_title("Rank = %s" % 32)
axarr[1,0].axis('off')

axarr[1,1].imshow(img, cmap = cm.Greys_r)
axarr[1,1].set_title("Rank = %s" % 16)
axarr[1,1].axis('off')

plt.show()

**注意:**要仅关闭x或y轴,您可以使用set_visible(),例如:

axarr[0,0].xaxis.set_visible(False) # Hide only x axis
slhcrj9b

slhcrj9b2#

import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, 2)

要关闭所有子图的轴,请执行以下操作之一:

[axi.set_axis_off() for axi in ax.ravel()]

map(lambda axi: axi.set_axis_off(), ax.ravel())
ttisahbt

ttisahbt3#

另一种可能的方法是在打印每个轴时将axison属性设置为False。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

img = mpimg.imread("Stewie_Griffin.png")

f, axarr = plt.subplots(2, 2)

for i, lst in enumerate([[512, 128], [32, 16]]):
    for j, rank in enumerate(lst):
        axarr[i,j].imshow(img)
        axarr[i,j].set_title(f"Rank = {rank}")
        axarr[i,j].axison = False           # <---- remove axis

如果您想清楚地看到删除的内容,可以使用Axes.set()分别“删除”帧和刻度。

axarr[i,j].set(frame_on=False, xticks=[], yticks=[])

最后,如果要在绘制图形后删除边框和刻度,可以循环遍历图形本身中的轴列表。

for ax in f.axes:
    ax.axison = False

注意:这里给出的所有三个方法(axis('off')set_axis_off()axison=False)都是等效的方法,因为在后台,axis('off')调用set_axis_off()set_axis_off()又调用axison=False,所以最终它们是相同的。

相关问题