Python pyplot函数(show、savefig等)在没有“";“对象”;被传进来了?

Python pyplot函数(show、savefig等)在没有“";“对象”;被传进来了?,python,matplotlib,Python,Matplotlib,像show()和savefig()这样的pyplot函数如何不需要“plot对象”来工作 例如,下面的方法可以工作,但不知何故,我希望使用文件处理程序或将“plot对象”传递到plt.show()和plot.savefig(“venn3.pdf”) []Pyplot使用全局变量保存地物对象。所有pyplot函数都使用该变量。如果您以交互方式工作,则pyplot非常好,因为只有您可以修改该变量。如果您正在编写多线程或多用户代码,pyplot将不起作用,您必须使用层benath it,它需要传入fi

show()
savefig()
这样的pyplot函数如何不需要“plot对象”来工作

例如,下面的方法可以工作,但不知何故,我希望使用文件处理程序或将“plot对象”传递到
plt.show()
plot.savefig(“venn3.pdf”)


[]

Pyplot使用全局变量保存地物对象。所有pyplot函数都使用该变量。如果您以交互方式工作,则pyplot非常好,因为只有您可以修改该变量。如果您正在编写多线程或多用户代码,pyplot将不起作用,您必须使用层benath it,它需要传入figure对象(这是一个糟糕的接口)。

matplotlib。pyplot
通常被称为“状态机”。这意味着它提供的函数根据pyplot的内部状态执行某些操作

在代码中,您已经创建了一个地物,并将其存储为一个对象;pyplot知道它只有一个数字

如果您随后调用其他命令,则假定它们应用于先前创建的图形,如
plt.savefig


plt.show()
可用于所有先前创建的图形(所有图形都将显示)。

@RoryDaulton不,不是。扩展:想象一个按需绘制图片的Web服务器——可能有多个用户同时尝试调用/绘制。如果您的Web服务器用户线程,pyplot将有非常有趣的错误。这将是使用pyplot进行多处理的一个示例,它运行良好。我也不认为matplotlib API很糟糕。它是我所知道的最好的文档化API之一,易于使用,并且是完全面向对象的。如果需要的话,没有任何东西可以阻止用户使用它。@ImportanceOfBeingErnest这是一种多处理(例如:每个请求都在它自己的请求中运行)。多线程可以完成(以flask dev server为例),但这不起作用,因为状态是共享的。
from matplotlib import pyplot as plt
from matplotlib_venn import venn3, venn3_circles

# Subset sizes
s = (2,3,4,3,1,0.5,4)

v = venn3(subsets=s, set_labels=('A', 'B', 'C'))

# Subset labels
v.get_label_by_id('100').set_text('Abc')
v.get_label_by_id('010').set_text('aBc')
v.get_label_by_id('110').set_text('ABc')
v.get_label_by_id('001').set_text('Abc')
v.get_label_by_id('101').set_text('aBc')
v.get_label_by_id('011').set_text('ABc')
v.get_label_by_id('111').set_text('ABC')

# Subset colors
v.get_patch_by_id('100').set_color('c')
v.get_patch_by_id('010').set_color('#993333')
v.get_patch_by_id('110').set_color('blue')

# Subset alphas
v.get_patch_by_id('101').set_alpha(0.4)
v.get_patch_by_id('011').set_alpha(1.0)
v.get_patch_by_id('111').set_alpha(0.7)

# Border styles
c = venn3_circles(subsets=s, linestyle='solid')
c[0].set_ls('dotted')  # Line style
c[1].set_ls('dashed')
c[2].set_lw(1.0)       # Line width

plt.show() # For show() to work without using variable v seems counter-intuitive to me.
plt.savefig("venn3.pdf") # For savefig() to work without using variable v seems counter-intuitive to me.