The following code does not do what I want: it shows a figure, waits for the user to close the window, then shows a second figure.
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))
I would like to have the two figures displayed simultaneously, so I could visually compare them, then e.g. choose one and close the other.
My requirement is to store all Matplotlib calls in just one user-defined function such as my_plot
.
I have read that show
has to be called after all plots have been defined, which does not fit the above requirement.
Actually I am almost losing hope that Matplotlib can do that by itself, perhaps the only solution is something like using a new thread for each call of my_plot
?
EDIT:
Problem solved. I hereunder share a function I wrote thanks to Nieznany's answer, that does exactly what I want. Of course it's improvable, but for most of my use cases it works and I can happily forget about 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")