如何在matplotlib中单独显示数字?

python matplotlib

89370 观看

4回复

33965 作者的声誉

假设我在matplotlib中有两个数字,每个数字有一个数字:

import matplotlib.pyplot as plt

f1 = plt.figure()
plt.plot(range(0,10))
f2 = plt.figure()
plt.plot(range(10,20))

然后我一次性展示

plt.show()

有没有办法单独显示它们,即只显示f1

或者更好:我如何单独管理数字,如下面的“如意”代码(不起作用):

f1 = plt.figure()
f1.plot(range(0,10))
f1.show()
作者: Federico A. Ramponi 的来源 发布者: 2010 年 3 月 7 日

回应 4


36

36412 作者的声誉

决定

当然。添加Axes使用add_subplot。(已编辑import。)(已编辑show。)

import matplotlib.pyplot as plt
f1 = plt.figure()
f2 = plt.figure()
ax1 = f1.add_subplot(111)
ax1.plot(range(0,10))
ax2 = f2.add_subplot(111)
ax2.plot(range(10,20))
plt.show()

或者,使用add_axes

ax1 = f1.add_axes([0.1,0.1,0.8,0.8])
ax1.plot(range(0,10))
ax2 = f2.add_axes([0.1,0.1,0.8,0.8])
ax2.plot(range(10,20))
作者: Steve Tjoa 发布者: 2010 年 3 月 7 日

2

26925 作者的声誉

也许你需要阅读关于Matplotlib的交互式使用。但是,如果您要构建应用程序,则应使用API并将数字嵌入所选GUI工具包的窗口中(请参阅examples/embedding_in_tk.py等)。

作者: Jouni K. Seppänen 发布者: 2010 年 3 月 7 日

23

54692 作者的声誉

使用版本1.0.1之前的Matplotlib,show() 每个程序只应调用一次,即使它似乎在某些环境(某些后端,某些平台等)中工作。

相关的绘图功能实际上是draw()

import matplotlib.pyplot as plt

plt.plot(range(10))  # Creates the plot.  No need to save the current figure.
plt.draw()  # Draws, but does not block
raw_input()  # This shows the first figure "separately" (by waiting for "enter").

plt.figure()  # New window, if needed.  No need to save it, as pyplot uses the concept of current figure
plt.plot(range(10, 20))
plt.draw()
# raw_input()  # If you need to wait here too...

# (...)

# Only at the end of your program:
plt.show()  # blocks

重要的是要认识到这show()是一个无限循环,旨在处理各种数字中的事件(调整大小等)。请注意,原则上,draw()如果您matplotlib.ion()在脚本的开头调用,则调用是可选的(虽然我已经看到在某些平台和后端上失败)。

我不认为Matplotlib提供了一种创建图形并可选择显示它的机制; 这意味着figure()将显示创建的所有数字。如果您只需要按顺序显示单独的图形(在同一窗口中或不在同一窗口中),您可以在上面的代码中执行。

现在,在简单的情况下,对于一些Matplotlib后端,上述解决方案可能就足够了。有些后端很好,即使你没有打电话,也可以让你与第一个数字进行交互show()。但是,据我所知,他们不一定要好。最强大的方法是在一个单独的线程中启动每个图形绘制show(),每个线程中都有一个final 。我相信这基本上就是IPython所做的。

上面的代码大部分时间都应该足够了。

PS:现在,使用Matplotlib版本1.0.1+,show()可以多次调用(大多数后端)。

作者: Eric Lebigot 发布者: 2010 年 3 月 8 日

0

1 作者的声誉

我认为你想要的是使用matplotlib的面向对象的API。在我的版本1.4.2和使用IPython 2.4.1和Qt4Agg后端for matplotlib,您可以执行以下操作:

import matplotlib.pyplot as plt
fig, ax = plt.subplots(1) # Creates figure fig and add an axes, ax.
fig2, ax2 = plt.subplots(1) # Another figure

ax.plot(range(20)) #Add a straight line to the axes of the first figure.
ax2.plot(range(100)) #Add a straight line to the axes of the first figure.

fig.show() #Only shows figure 1 and removes it from the "current" stack.
fig2.show() #Only shows figure 2 and removes it from the "current" stack.
plt.show() #Does not show anything, because there is nothing in the "current" stack.
fig.show() # Shows figure 1 again. You can show it as many times as you want.

在这种情况下,plt.show()显示“当前”堆栈中的任何内容。如果您使用的是GUI后端(例如Qt4Agg),那么您可以执行figure.show()。如果没有,那我就不知道怎么做了。

请记住,大多数(所有?)plt。*函数只是图形和轴方法的快捷方式和别名。它们对顺序编程非常有用,但如果您计划以更复杂的方式使用它们,您很快就会发现阻塞墙。

作者: Iván Paradela Pérez 发布者: 2018 年 11 月 7 日
32x32