summaryrefslogtreecommitdiff
path: root/scripts/tracing/dma-api/plotting.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/tracing/dma-api/plotting.py')
-rw-r--r--scripts/tracing/dma-api/plotting.py100
1 files changed, 100 insertions, 0 deletions
diff --git a/scripts/tracing/dma-api/plotting.py b/scripts/tracing/dma-api/plotting.py
new file mode 100644
index 000000000000..f3d69b6a36a4
--- /dev/null
+++ b/scripts/tracing/dma-api/plotting.py
@@ -0,0 +1,100 @@
+"""Ugly graph drawing tools"""
+import matplotlib.pyplot as plt
+import matplotlib.cm as cmap
+#import numpy as np
+from matplotlib import cbook
+
+# http://stackoverflow.com/questions/4652439/is-there-a-matplotlib-equivalent-of-matlabs-datacursormode
+class DataCursor(object):
+ """A simple data cursor widget that displays the x,y location of a
+ matplotlib artist when it is selected."""
+ def __init__(self, artists, tolerance=5, offsets=(-20, 20),
+ template='x: %0.2f\ny: %0.2f', display_all=False):
+ """Create the data cursor and connect it to the relevant figure.
+ "artists" is the matplotlib artist or sequence of artists that will be
+ selected.
+ "tolerance" is the radius (in points) that the mouse click must be
+ within to select the artist.
+ "offsets" is a tuple of (x,y) offsets in points from the selected
+ point to the displayed annotation box
+ "template" is the format string to be used. Note: For compatibility
+ with older versions of python, this uses the old-style (%)
+ formatting specification.
+ "display_all" controls whether more than one annotation box will
+ be shown if there are multiple axes. Only one will be shown
+ per-axis, regardless.
+ """
+ self.template = template
+ self.offsets = offsets
+ self.display_all = display_all
+ if not cbook.iterable(artists):
+ artists = [artists]
+ self.artists = artists
+ self.axes = tuple(set(art.axes for art in self.artists))
+ self.figures = tuple(set(ax.figure for ax in self.axes))
+
+ self.annotations = {}
+ for ax in self.axes:
+ self.annotations[ax] = self.annotate(ax)
+
+ for artist in self.artists:
+ artist.set_picker(tolerance)
+ for fig in self.figures:
+ fig.canvas.mpl_connect('pick_event', self)
+
+ def annotate(self, ax):
+ """Draws and hides the annotation box for the given axis "ax"."""
+ annotation = ax.annotate(self.template, xy=(0, 0), ha='right',
+ xytext=self.offsets, textcoords='offset points', va='bottom',
+ bbox=dict(boxstyle='round,pad=0.5', fc='yellow', alpha=0.5),
+ arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0')
+ )
+ annotation.set_visible(False)
+ return annotation
+
+ def __call__(self, event):
+ """Intended to be called through "mpl_connect"."""
+ # Rather than trying to interpolate, just display the clicked coords
+ # This will only be called if it's within "tolerance", anyway.
+ x, y = event.mouseevent.xdata, event.mouseevent.ydata
+ try:
+ annotation = self.annotations[event.artist.axes]
+ except KeyError:
+ return
+ if x is not None:
+ if not self.display_all:
+ # Hide any other annotation boxes...
+ for ann in self.annotations.values():
+ ann.set_visible(False)
+ # Update the annotation in the current axis..
+ annotation.xy = x, y
+ annotation.set_text(self.template % (x, y))
+ annotation.set_visible(True)
+ event.canvas.draw()
+
+def plotseries(*serieslabels):
+ """Plot lists of series in separate axes, tie time axis together"""
+ global fig
+ fig, axes = plt.subplots(nrows=len(serieslabels), sharex=True)
+
+ for subplot, ax in zip(serieslabels, axes):
+ for ser, lab in zip(*subplot): # subplot = ([x], [y])
+ ax.step(ser[0], ser[1], label=lab, where="post")
+ ax.grid(True)
+ ax.legend()
+
+ (DataCursor(ax.lines))
+ plt.grid(True)
+ plt.show()
+
+
+
+def disp_pic(bitmap):
+ """Display the allocation bitmap. TODO."""
+ fig=plt.figure()
+ a=fig.add_subplot(1,1,1)
+ fig.clf()
+ implt=plt.imshow(bitmap, extent=(0, len(bitmap[0]), 0, len(bitmap)),
+ interpolation="nearest", cmap=cmap.gist_heat)
+ fig.canvas.draw()
+ plt.show()