通过多次调用一个函数来显示多个Matplotlib图形



下面的代码并没有达到我想要的效果:它显示了一个图形,等待用户关闭窗口,然后显示第二个图形。

def my_plot(arr_x, arr_y):
import matplotlib.pyplot as plt
plt.plot(arr_x, arr_y)
plt.show()
if __name__ == '__main__':
my_plot((1, 2, 3), (10, 20, 90))
my_plot((101, 102, 103), (1, 5, 4))

我想同时显示这两个数字,这样我就可以直观地比较它们,然后选择一个并关闭另一个。我的要求是将所有Matplotlib调用存储在一个用户定义的函数中,例如my_plot

我读到,必须在定义完所有绘图后调用show,这不符合上述要求。

事实上,我几乎对Matplotlib自己能做到这一点失去了希望,也许唯一的解决方案是为my_plot的每个调用使用一个新线程?


编辑:
问题已解决。下面我分享一个感谢Niezany的回答而写的函数,它正是我想要的。当然,它是可以改进的,但在我的大多数用例中,它都是有效的,我可以很高兴地忘记Matplotlib。

#!/usr/bin/env python
import matplotlib.pyplot as plt
from os.path import splitext
def plot_XY(arr_x, arr_y, graph_file_name=None, graph_title="", x_label="", y_label=""):
"""Plot a series of (x, y) points.
If graph_file_name is not provided, the graph is
plotted in a temporary window; else, the file
format is deduced from the extension contained
in graph_file_name.
"""
def create_figure():
plt.figure()
plt.plot(arr_x, arr_y)
plt.title(graph_title)
plt.xlabel(x_label)
plt.ylabel(y_label)
if graph_file_name is None:
def my_show():
create_figure()
plt.show()
from multiprocessing import Process
Process(target=my_show, args=[]).start()
else:
extension = splitext(graph_file_name)[1][1:] # Get extension, without dot
if extension not in ("eps", "pdf", "pgf", "png", "ps", "raw", "rgba", "svg", "svgz"):
print(f""{extension}" is not a file extension recognized by savefig. Assuming png.")
extension = "png"
graph_file_name += "." + extension
create_figure()
plt.savefig(graph_file_name, format=extension)
plt.close()
if __name__ == '__main__':
# Test: calling the function multiple times:
x = (1, 2, 3)
plot_XY(x, (1, 4, 2), graph_title="Example")
plot_XY(x, (2, 3, 1), graph_file_name="output.abc")
plot_XY(x, (1, 4, 9), x_label="x", y_label="x^2")

您可以使用单个进程来绘制窗口并显示它,而不会阻塞主进程
示例解决方案:

def my_plot(arr_x, arr_y):
import matplotlib.pyplot as plt
from multiprocessing import Process
def _my_plot(arr_x, arr_y):
plt.figure()
plt.plot(arr_x, arr_y)
plt.show()
Process(target=_my_plot, args=[arr_x,arr_y]).start()
if __name__ == '__main__':
my_plot((1, 2, 3), (10, 20, 90))
my_plot((101, 102, 103), (1, 5, 4))

资源

创建完所有图形后,请调用plt.show()
import matplotlib.pyplot as plt
def my_plot(arr_x, arr_y):
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(arr_x, arr_y)
return fig
if __name__ == '__main__':
f1 = my_plot((1, 2, 3), (10, 20, 90))
f2 = my_plot((101, 102, 103), (1, 5, 4))
plt.show()

最新更新