forked from alexras/boomslang
-
Notifications
You must be signed in to change notification settings - Fork 0
/
StackedLines.py
81 lines (65 loc) · 2.63 KB
/
StackedLines.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import pylab
from matplotlib import pyplot
from matplotlib.patches import Rectangle
from PlotInfo import *
from Line import *
import sys
class StackedLines(PlotInfo):
"""
Lines stacked one atop the other, with colors filling in the gaps
"""
def __init__(self):
super(StackedLines,self).__init__("stacked lines")
self.lines = []
self.colors = []
def addLine(self, line, color="white"):
"""
Add `line` (a :class:`boomslang.Line.Line`) to the stack of lines,
coloring the gap between it and the previous line with `color`
"""
self.lines.append(line)
self.colors.append(color)
def draw(self, fig, axis, transform=None):
super(StackedLines, self).draw(fig, axis)
plotHandles = []
plotLabels = []
xValues = None
yValues = []
for line in self.lines:
if xValues == None:
xValues = line.xValues
yValues.append(line.yValues)
yDataStacked = self._cumulativeSum(yValues)
axis.fill_between(xValues, 0, yDataStacked[0],
facecolor=self.colors[0],
linestyle=self.lines[0].lineStyle,
linewidth=self.lines[0].lineWidth)
# Since fill_between doesn't have legend support, will have to create a
# proxy artist for it. See
# http://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist
proxyArtist = Rectangle((0,0), 1, 1, color=self.colors[0])
plotHandles.append(proxyArtist)
plotLabels.append(self.lines[0].label)
for i in xrange(len(yDataStacked) - 1):
axis.fill_between(xValues, yDataStacked[i],
yDataStacked[i + 1],
facecolor=self.colors[i + 1],
linestyle=self.lines[i+1].lineStyle,
linewidth=self.lines[i+1].lineWidth)
proxyArtist = Rectangle((0,0), 1, 1, color=self.colors[i+1])
plotHandles.append(proxyArtist)
plotLabels.append(self.lines[i+1].label)
return [plotHandles, plotLabels]
def _cumulativeSum(self, yValuesLists):
output = []
for i in xrange(len(yValuesLists)):
currentList = yValuesLists[i]
if i == 0:
output.append(currentList)
continue
else:
prevList = output[i-1]
newList = [currentList[i] + prevList[i]
for i in xrange(len(currentList))]
output.append(newList)
return output