以下代码无法满足我的要求:它显示一个图形,等待用户关闭窗口,然后显示第二个图形。
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
的每次调用都使用一个新线程?
编辑:
问题解决了。我下面分享了我感谢Nieznany的回答而编写的一个函数,该函数正是我想要的。当然这是可以改进的,但是对于我的大多数用例来说,它都是可行的,我可以很高兴地忘记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")
答案 0 :(得分:3)
您可以使用单个过程来绘制窗口并显示它,而不会阻塞主过程。
解决方案示例:
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))
答案 1 :(得分:0)
创建所有图形后,致电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()