Matplotlib plt.show() 只显示了选中的对象。

6

我有几个plt.plot示例,我希望只显示某些对象,以下是一些代码示例:

import matplotlib.pyplot as plt

ax1 = plt.plot(range(5),range(5))
ax2 = plt.plot([x+1 for x in range(5)],[x+1 for x in range(5)])
ax3 = plt.plot([x+2 for x in range(5)],[x+2 for x in range(5)])

#plt.show([ax1,ax2])
plt.show()

所以我希望像注释掉的语句一样,在示例图中仅显示ax1和ax2。

2个回答

5
您可以从当前坐标轴的线集中删除一些绘制线:
axes = plt.gca()  # Get current axes
axes.lines.remove(ax2[0])  # Removes the (first and only) line created in ax2
plt.draw()  # Updates the graph (in interactive mode)

如果你想把它放回去,同样可以这样做。
axes.lines.append(ax2[0])  # Puts the line back (the drawing order is changed, here)

如果需要以后再次使用当前图表线条,您可以选择保存它们:

all_lines = list(axes.lines)  # Copy
# ...
axes.lines[:] = all_lines  # All lines put back

关键点是每个plot()命令都会向当前轴添加一条线并绘制它(在交互模式下)。因此,您可以删除已经绘制的线条(就像在此答案中所示)。
正如Yann指出的那样,您也可以使某些行变得不可见。但是,如果有更少的线需要绘制,则此答案提供的方法可能更快(如果这很重要)。

谢谢,速度是个问题,所以我更喜欢这种方法。我真的觉得它更简单,而且我可能错过了一些明显的东西。 - Anake
@Anake:谢谢。所有这些背后的原则都是,一旦绘制了某个东西,它就被绘制出来了:plot()调用会向Matplotlib Axis添加诸如线条等对象,并大多忘记它们来自哪里。一旦它们被添加,删除它们必然需要几个步骤。 - Eric O. Lebigot

3
并不完全正确。首先,plt.plot调用不会返回一个坐标轴,而是返回一个Line2D对象列表,每个对象代表一个绘制的线条。您可以使用Matplotlib的面向对象(OO)接口为每个图形创建单独的坐标轴,然后选择性地将其作为子图添加到图形中等等。有很多不同的方法来选择性地显示图形。
但对于您的示例,您可以利用Line2D的alpha值,即其不透明度,使任何一条线条变得不可见。以下是您示例的修改版本:
import matplotlib.pyplot as plt

line1 = plt.plot(range(5),range(5))
line2 = plt.plot([x+1 for x in range(5)],[x+1 for x in range(5)])
line3 = plt.plot([x+2 for x in range(5)],[x+2 for x in range(5)])
print line3, " see I'm a list of lines"
print line3[0].get_alpha()
line3[0].set_alpha(0) # make complete opaque

#plt.show([ax1,ax2])
plt.gcf().savefig('line3opaque.png')
line3[0].set_alpha(1) # make visible
line1[0].set_alpha(0) # make opaque
plt.gcf().savefig('line1opaque.png')
plt.show()

我保存的第一张图是'line3opaque.png',它展示了以下内容:enter image description here, 可以看出缺少了第三行而第一和第二行还在。而对于'line1opaque.png',我得到了以下结果:enter image description here,这次缺少了第一行。

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