OpenMPCD
mergeAxes.py
1 def mergeAxes(axesList):
2  """
3  Takes the given `axesList`, and returns a new `matplotlib.axes` instance
4  that contains all the lines in the given axes.
5 
6  @param[in] axesList
7  A list of instances of `matplotlib.axes`.
8  """
9 
10  import matplotlib
11 
12  if not isinstance(axesList, list):
13  raise TypeError()
14  for axes in axesList:
15  if not isinstance(axes, matplotlib.axes.Axes):
16  raise TypeError()
17 
18 
19  retAxes = matplotlib.figure.Figure().add_subplot(1, 1, 1)
20  titles = []
21  xLabels = []
22  yLabels = []
23  retLines = []
24  legendLabels = []
25 
26  for sourceAxes in axesList:
27  for line in sourceAxes.get_lines():
28  newLine, = retAxes.plot(line.get_xdata(), line.get_ydata())
29  retLines.append(newLine)
30 
31  titles.append(sourceAxes.get_title())
32  xLabels.append(sourceAxes.get_xlabel())
33  yLabels.append(sourceAxes.get_ylabel())
34 
35  for text in sourceAxes.get_legend().get_texts():
36  legendLabels.append(text.get_text())
37 
38  retAxes.legend(retLines, legendLabels)
39 
40  uniqueTitles = list(set(titles))
41  uniqueXLabels = list(set(xLabels))
42  uniqueYLabels = list(set(yLabels))
43 
44  def labelSetter(uniqueLabels, setter):
45  if len(uniqueLabels) == 0:
46  return
47 
48  if len(uniqueLabels) == 1:
49  setter(uniqueLabels[0])
50  return
51 
52  label = None
53  for l in uniqueLabels:
54  if label is None:
55  label = l
56  else:
57  label += " | " + l
58  setter(label)
59 
60  labelSetter(uniqueTitles, retAxes.set_title)
61  labelSetter(uniqueXLabels, retAxes.set_xlabel)
62  labelSetter(uniqueYLabels, retAxes.set_ylabel)
63 
64  return retAxes