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

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

import matplotlib.cbook as cbook 

import matplotlib.artist as martist 

 

 

class Container(tuple): 

""" 

Base class for containers. 

 

Containers are classes that collect semantically related Artists such as 

the bars of a bar plot. 

""" 

 

def __repr__(self): 

return ("<{} object of {} artists>" 

.format(type(self).__name__, len(self))) 

 

def __new__(cls, *kl, **kwargs): 

return tuple.__new__(cls, kl[0]) 

 

def __init__(self, kl, label=None): 

 

self.eventson = False # fire events only if eventson 

self._oid = 0 # an observer id 

self._propobservers = {} # a dict from oids to funcs 

 

self._remove_method = None 

 

self.set_label(label) 

 

@cbook.deprecated("3.0") 

def set_remove_method(self, f): 

self._remove_method = f 

 

def remove(self): 

for c in cbook.flatten( 

self, scalarp=lambda x: isinstance(x, martist.Artist)): 

if c is not None: 

c.remove() 

 

if self._remove_method: 

self._remove_method(self) 

 

def get_label(self): 

""" 

Get the label used for this artist in the legend. 

""" 

return self._label 

 

def set_label(self, s): 

""" 

Set the label to *s* for auto legend. 

 

Parameters 

---------- 

s : string or anything printable with '%s' conversion. 

""" 

if s is not None: 

self._label = '%s' % (s, ) 

else: 

self._label = None 

self.pchanged() 

 

def add_callback(self, func): 

""" 

Adds a callback function that will be called whenever one of 

the :class:`Artist`'s properties changes. 

 

Returns an *id* that is useful for removing the callback with 

:meth:`remove_callback` later. 

""" 

oid = self._oid 

self._propobservers[oid] = func 

self._oid += 1 

return oid 

 

def remove_callback(self, oid): 

""" 

Remove a callback based on its *id*. 

 

.. seealso:: 

 

:meth:`add_callback` 

For adding callbacks 

 

""" 

try: 

del self._propobservers[oid] 

except KeyError: 

pass 

 

def pchanged(self): 

""" 

Fire an event when property changed, calling all of the 

registered callbacks. 

""" 

for oid, func in list(self._propobservers.items()): 

func(self) 

 

def get_children(self): 

return [child for child in cbook.flatten(self) if child is not None] 

 

 

class BarContainer(Container): 

""" 

Container for the artists of bar plots (e.g. created by `.Axes.bar`). 

 

The container can be treated as a tuple of the *patches* themselves. 

Additionally, you can access these and further parameters by the 

attributes. 

 

Attributes 

---------- 

patches : list of :class:`~matplotlib.patches.Rectangle` 

The artists of the bars. 

 

errorbar : None or :class:`~matplotlib.container.ErrorbarContainer` 

A container for the error bar artists if error bars are present. 

*None* otherwise. 

 

""" 

 

def __init__(self, patches, errorbar=None, **kwargs): 

self.patches = patches 

self.errorbar = errorbar 

Container.__init__(self, patches, **kwargs) 

 

 

class ErrorbarContainer(Container): 

""" 

Container for the artists of error bars (e.g. created by `.Axes.errorbar`). 

 

The container can be treated as the *lines* tuple itself. 

Additionally, you can access these and further parameters by the 

attributes. 

 

Attributes 

---------- 

lines : tuple 

Tuple of ``(data_line, caplines, barlinecols)``. 

 

- data_line : :class:`~matplotlib.lines.Line2D` instance of 

x, y plot markers and/or line. 

- caplines : tuple of :class:`~matplotlib.lines.Line2D` instances of 

the error bar caps. 

- barlinecols : list of :class:`~matplotlib.collections.LineCollection` 

with the horizontal and vertical error ranges. 

 

has_xerr, has_yerr : bool 

``True`` if the errorbar has x/y errors. 

 

""" 

 

def __init__(self, lines, has_xerr=False, has_yerr=False, **kwargs): 

self.lines = lines 

self.has_xerr = has_xerr 

self.has_yerr = has_yerr 

Container.__init__(self, lines, **kwargs) 

 

 

class StemContainer(Container): 

""" 

Container for the artists created in a :meth:`.Axes.stem` plot. 

 

The container can be treated like a namedtuple ``(markerline, stemlines, 

baseline)``. 

 

Attributes 

---------- 

markerline : :class:`~matplotlib.lines.Line2D` 

The artist of the markers at the stem heads. 

 

stemlines : list of :class:`~matplotlib.lines.Line2D` 

The artists of the vertical lines for all stems. 

 

baseline : :class:`~matplotlib.lines.Line2D` 

The artist of the horizontal baseline. 

 

""" 

 

def __init__(self, markerline_stemlines_baseline, **kwargs): 

markerline, stemlines, baseline = markerline_stemlines_baseline 

self.markerline = markerline 

self.stemlines = stemlines 

self.baseline = baseline 

Container.__init__(self, markerline_stemlines_baseline, **kwargs)