plt.show()在第二次使用时不执行任何操作

时间:2018-05-21 15:53:24

标签: python matplotlib

我刚开始在Data Camp上使用python学习数据科学,我在使用matplotlib.pyplot中的函数时发现了一些东西

import matplotlib.pyplot as plt

year = [1500, 1600, 1700, 1800, 1900, 2000]
pop = [458, 580, 682, 1000, 1650, 6,127]

plt.plot(year, pop)

plt.show() # Here a window opens up and shows the figure for the first time

但是当我试图再次显示它时它不会......

plt.show() # for the second time.. nothing happens

我必须重新输入show()上方的一行才能再显示一个数字

这是正常的还是问题?

注意:我正在使用REPL

3 个答案:

答案 0 :(得分:4)

答案

是的,这是matplotlib图形的正常预期行为。


说明

运行plt.plot(...)时,您一方面创建了实际图的lines实例:

>>> print( plt.plot(year, pop) )
[<matplotlib.lines.Line2D object at 0x000000000D8FDB00>]

...另一方面,还有一个Figure实例,它被设置为“当前图形”,可以通过plt.gcf()访问(“获取当前图形”的缩写):

>>> print( plt.gcf() )
Figure(432x288)

线(以及您可能添加的其他绘图元素)都放置在当前图形中。调用plt.show()时,当前图形显示为,然后清空(!),这就是为什么第二次调用plt.show()不会显示任何内容的原因。


标准解决方法

解决此问题的一种方法是显式保留当前的Figure实例,然后直接通过fig.show()显示它,如下所示:

plt.plot(year, pop)
fig = plt.gcf()  # Grabs the current figure

plt.show()  # Shows plot
plt.show()  # Does nothing

fig.show()  # Shows plot again
fig.show()  # Shows plot again...

一种更常用的替代方法是,在执行任何绘图命令之前,首先在开始时显式初始化当前图形。

fig = plt.figure()   # Initializes current figure
plt.plot(year, pop)  # Adds to current figure

plt.show()  # Shows plot
fig.show()  # Shows plot again

这通常与图中其他一些参数的说明结合在一起,例如:

fig = plt.figure(figsize=(8,8))

对于Jupyter Notebook用户

fig.show()方法可能无法在Jupyter Notebook的上下文中使用,而是可能产生以下警告并且不显示图:

  

C:\ redacted \ path \ lib \ site-packages \ matplotlib \ figure.py:459:   UserWarning:matplotlib当前正在使用非GUI后端,因此   无法显示数字

幸运的是,只需在代码单元末尾(而不是fig处写fig.show()),便会将图形推到该单元的输出并以任何方式显示它。如果需要在同一代码单元中多次显示它,则可以使用display函数来达到相同的效果:

fig = plt.figure()   # Initializes current figure
plt.plot(year, pop)  # Adds to current figure

plt.show()  # Shows plot
plt.show()  # Does nothing

from IPython.display import display
display(fig)  # Shows plot again
display(fig)  # Shows plot again...

使用功能

要多次show的一个原因是每次都要进行各种不同的修改。可以使用上面讨论的fig方法来完成此操作,但是对于更广泛的图形定义,将基本图形包装到函数中并重复调用通常会更容易。

示例:

def my_plot(year, pop):
    plt.plot(year, pop)
    plt.xlabel("year")
    plt.ylabel("population")

my_plot(year, pop)
plt.show()  # Shows plot

my_plot(year, pop)
plt.show()  # Shows plot again

my_plot(year, pop)
plt.title("demographics plot")
plt.show()  # Shows plot again, this time with title

答案 1 :(得分:0)

使用命令:

%matplotlib

ipython3中的

帮我使用带有绘图的单独窗口

答案 2 :(得分:0)

启动ipython3并发出命令:

import matplotlib.pyplot as plt
%matplotlib #plot in separate window
fig, ax = plt.subplots() #Appear empty Tcl window for image
ax.plot([1, 2, 3, 4], [5, 6, 7, 8]) #Appear graph in window

enter image description here