Python matplotlib.path.Path.arc() Examples
The following are 30
code examples of matplotlib.path.Path.arc().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
matplotlib.path.Path
, or try the search function
.
Example #1
Source File: patches.py From Computable with MIT License | 5 votes |
def __init__(self, xy, width, height, angle=0.0, theta1=0.0, theta2=360.0, **kwargs): """ The following args are supported: *xy* center of ellipse *width* length of horizontal axis *height* length of vertical axis *angle* rotation in degrees (anti-clockwise) *theta1* starting angle of the arc in degrees *theta2* ending angle of the arc in degrees If *theta1* and *theta2* are not provided, the arc will form a complete ellipse. Valid kwargs are: %(Patch)s """ fill = kwargs.setdefault('fill', False) if fill: raise ValueError("Arc objects can not be filled") Ellipse.__init__(self, xy, width, height, angle, **kwargs) self.theta1 = theta1 self.theta2 = theta2 self._path = Path.arc(self.theta1, self.theta2)
Example #2
Source File: test_path.py From twitter-stock-recommendation with MIT License | 5 votes |
def test_full_arc(offset): low = offset high = 360 + offset path = Path.arc(low, high) mins = np.min(path.vertices, axis=0) maxs = np.max(path.vertices, axis=0) np.testing.assert_allclose(mins, -1) assert np.allclose(maxs, 1)
Example #3
Source File: test_path.py From coffeegrindsize with MIT License | 5 votes |
def test_full_arc(offset): low = offset high = 360 + offset path = Path.arc(low, high) mins = np.min(path.vertices, axis=0) maxs = np.max(path.vertices, axis=0) np.testing.assert_allclose(mins, -1) assert np.allclose(maxs, 1)
Example #4
Source File: matplotlib_venn.py From altanalyze with Apache License 2.0 | 5 votes |
def make_venn3_region_patch(region): ''' Given a venn3 region (as returned from compute_venn3_regions) produces a Patch object, depicting the region as a curve. >>> centers, radii = solve_venn3_circles((1, 1, 1, 1, 1, 1, 1)) >>> regions = compute_venn3_regions(centers, radii) >>> patches = [make_venn3_region_patch(r) for r in regions] ''' if region is None or len(region[0]) == 0: return None if region[0] == "CIRCLE": return Circle(region[1][0], region[1][1]) pts, arcs, label_pos = region path = [pts[0]] for i in range(len(pts)): j = (i + 1) % len(pts) (center, radius, direction) = arcs[i] fromangle = vector_angle_in_degrees(pts[i] - center) toangle = vector_angle_in_degrees(pts[j] - center) if direction: vertices = Path.arc(fromangle, toangle).vertices else: vertices = Path.arc(toangle, fromangle).vertices vertices = vertices[np.arange(len(vertices) - 1, -1, -1)] vertices = vertices * radius + center path = path + list(vertices[1:]) codes = [1] + [4] * (len(path) - 1) return PathPatch(Path(path, codes))
Example #5
Source File: patches.py From ImageFusion with MIT License | 5 votes |
def set_connectionstyle(self, connectionstyle, **kw): """ Set the connection style. *connectionstyle* can be a string with connectionstyle name with optional comma-separated attributes. Alternatively, the attrs can be probided as keywords. set_connectionstyle("arc,angleA=0,armA=30,rad=10") set_connectionstyle("arc", angleA=0,armA=30,rad=10) Old attrs simply are forgotten. Without argument (or with connectionstyle=None), return available styles as a list of strings. """ if connectionstyle is None: return ConnectionStyle.pprint_styles() if isinstance(connectionstyle, ConnectionStyle._Base): self._connector = connectionstyle elif six.callable(connectionstyle): # we may need check the calling convention of the given function self._connector = connectionstyle else: self._connector = ConnectionStyle(connectionstyle, **kw)
Example #6
Source File: patches.py From ImageFusion with MIT License | 5 votes |
def __init__(self, xy, width, height, angle=0.0, theta1=0.0, theta2=360.0, **kwargs): """ The following args are supported: *xy* center of ellipse *width* length of horizontal axis *height* length of vertical axis *angle* rotation in degrees (anti-clockwise) *theta1* starting angle of the arc in degrees *theta2* ending angle of the arc in degrees If *theta1* and *theta2* are not provided, the arc will form a complete ellipse. Valid kwargs are: %(Patch)s """ fill = kwargs.setdefault('fill', False) if fill: raise ValueError("Arc objects can not be filled") Ellipse.__init__(self, xy, width, height, angle, **kwargs) self.theta1 = theta1 self.theta2 = theta2 self._path = Path.arc(self.theta1, self.theta2)
Example #7
Source File: patches.py From ImageFusion with MIT License | 5 votes |
def _recompute_path(self): # Inner and outer rings are connected unless the annulus is complete if abs((self.theta2 - self.theta1) - 360) <= 1e-12: theta1, theta2 = 0, 360 connector = Path.MOVETO else: theta1, theta2 = self.theta1, self.theta2 connector = Path.LINETO # Form the outer ring arc = Path.arc(theta1, theta2) if self.width is not None: # Partial annulus needs to draw the outer ring # followed by a reversed and scaled inner ring v1 = arc.vertices v2 = arc.vertices[::-1] * float(self.r - self.width) / self.r v = np.vstack([v1, v2, v1[0, :], (0, 0)]) c = np.hstack([arc.codes, arc.codes, connector, Path.CLOSEPOLY]) c[len(arc.codes)] = connector else: # Wedge doesn't need an inner ring v = np.vstack([arc.vertices, [(0, 0), arc.vertices[0, :], (0, 0)]]) c = np.hstack([arc.codes, [connector, connector, Path.CLOSEPOLY]]) # Shift and scale the wedge to the final location. v *= self.r v += np.asarray(self.center) self._path = Path(v, c)
Example #8
Source File: test_path.py From python3_ios with BSD 3-Clause "New" or "Revised" License | 5 votes |
def test_full_arc(offset): low = offset high = 360 + offset path = Path.arc(low, high) mins = np.min(path.vertices, axis=0) maxs = np.max(path.vertices, axis=0) np.testing.assert_allclose(mins, -1) assert np.allclose(maxs, 1)
Example #9
Source File: patches.py From neural-network-animation with MIT License | 5 votes |
def set_connectionstyle(self, connectionstyle, **kw): """ Set the connection style. *connectionstyle* can be a string with connectionstyle name with optional comma-separated attributes. Alternatively, the attrs can be probided as keywords. set_connectionstyle("arc,angleA=0,armA=30,rad=10") set_connectionstyle("arc", angleA=0,armA=30,rad=10) Old attrs simply are forgotten. Without argument (or with connectionstyle=None), return available styles as a list of strings. """ if connectionstyle is None: return ConnectionStyle.pprint_styles() if isinstance(connectionstyle, ConnectionStyle._Base): self._connector = connectionstyle elif six.callable(connectionstyle): # we may need check the calling convention of the given function self._connector = connectionstyle else: self._connector = ConnectionStyle(connectionstyle, **kw)
Example #10
Source File: patches.py From neural-network-animation with MIT License | 5 votes |
def __init__(self, xy, width, height, angle=0.0, theta1=0.0, theta2=360.0, **kwargs): """ The following args are supported: *xy* center of ellipse *width* length of horizontal axis *height* length of vertical axis *angle* rotation in degrees (anti-clockwise) *theta1* starting angle of the arc in degrees *theta2* ending angle of the arc in degrees If *theta1* and *theta2* are not provided, the arc will form a complete ellipse. Valid kwargs are: %(Patch)s """ fill = kwargs.setdefault('fill', False) if fill: raise ValueError("Arc objects can not be filled") Ellipse.__init__(self, xy, width, height, angle, **kwargs) self.theta1 = theta1 self.theta2 = theta2 self._path = Path.arc(self.theta1, self.theta2)
Example #11
Source File: patches.py From neural-network-animation with MIT License | 5 votes |
def _recompute_path(self): # Inner and outer rings are connected unless the annulus is complete if abs((self.theta2 - self.theta1) - 360) <= 1e-12: theta1, theta2 = 0, 360 connector = Path.MOVETO else: theta1, theta2 = self.theta1, self.theta2 connector = Path.LINETO # Form the outer ring arc = Path.arc(theta1, theta2) if self.width is not None: # Partial annulus needs to draw the outer ring # followed by a reversed and scaled inner ring v1 = arc.vertices v2 = arc.vertices[::-1] * float(self.r - self.width) / self.r v = np.vstack([v1, v2, v1[0, :], (0, 0)]) c = np.hstack([arc.codes, arc.codes, connector, Path.CLOSEPOLY]) c[len(arc.codes)] = connector else: # Wedge doesn't need an inner ring v = np.vstack([arc.vertices, [(0, 0), arc.vertices[0, :], (0, 0)]]) c = np.hstack([arc.codes, [connector, connector, Path.CLOSEPOLY]]) # Shift and scale the wedge to the final location. v *= self.r v += np.asarray(self.center) self._path = Path(v, c)
Example #12
Source File: patches.py From Computable with MIT License | 5 votes |
def _recompute_path(self): # Inner and outer rings are connected unless the annulus is complete if abs((self.theta2 - self.theta1) - 360) <= 1e-12: theta1, theta2 = 0, 360 connector = Path.MOVETO else: theta1, theta2 = self.theta1, self.theta2 connector = Path.LINETO # Form the outer ring arc = Path.arc(theta1, theta2) if self.width is not None: # Partial annulus needs to draw the outer ring # followed by a reversed and scaled inner ring v1 = arc.vertices v2 = arc.vertices[::-1] * float(self.r - self.width) / self.r v = np.vstack([v1, v2, v1[0, :], (0, 0)]) c = np.hstack([arc.codes, arc.codes, connector, Path.CLOSEPOLY]) c[len(arc.codes)] = connector else: # Wedge doesn't need an inner ring v = np.vstack([arc.vertices, [(0, 0), arc.vertices[0, :], (0, 0)]]) c = np.hstack([arc.codes, [connector, connector, Path.CLOSEPOLY]]) # Shift and scale the wedge to the final location. v *= self.r v += np.asarray(self.center) self._path = Path(v, c)
Example #13
Source File: patches.py From matplotlib-4-abaqus with MIT License | 5 votes |
def set_connectionstyle(self, connectionstyle, **kw): """ Set the connection style. *connectionstyle* can be a string with connectionstyle name with optional comma-separated attributes. Alternatively, the attrs can be probided as keywords. set_connectionstyle("arc,angleA=0,armA=30,rad=10") set_connectionstyle("arc", angleA=0,armA=30,rad=10) Old attrs simply are forgotten. Without argument (or with connectionstyle=None), return available styles as a list of strings. """ if connectionstyle is None: return ConnectionStyle.pprint_styles() if isinstance(connectionstyle, ConnectionStyle._Base): self._connector = connectionstyle elif callable(connectionstyle): # we may need check the calling convention of the given function self._connector = connectionstyle else: self._connector = ConnectionStyle(connectionstyle, **kw)
Example #14
Source File: patches.py From matplotlib-4-abaqus with MIT License | 5 votes |
def __init__(self, xy, width, height, angle=0.0, theta1=0.0, theta2=360.0, **kwargs): """ The following args are supported: *xy* center of ellipse *width* length of horizontal axis *height* length of vertical axis *angle* rotation in degrees (anti-clockwise) *theta1* starting angle of the arc in degrees *theta2* ending angle of the arc in degrees If *theta1* and *theta2* are not provided, the arc will form a complete ellipse. Valid kwargs are: %(Patch)s """ fill = kwargs.setdefault('fill', False) if fill: raise ValueError("Arc objects can not be filled") Ellipse.__init__(self, xy, width, height, angle, **kwargs) self.theta1 = theta1 self.theta2 = theta2 self._path = Path.arc(self.theta1, self.theta2)
Example #15
Source File: patches.py From matplotlib-4-abaqus with MIT License | 5 votes |
def _recompute_path(self): # Inner and outer rings are connected unless the annulus is complete if abs((self.theta2 - self.theta1) - 360) <= 1e-12: theta1, theta2 = 0, 360 connector = Path.MOVETO else: theta1, theta2 = self.theta1, self.theta2 connector = Path.LINETO # Form the outer ring arc = Path.arc(theta1, theta2) if self.width is not None: # Partial annulus needs to draw the outer ring # followed by a reversed and scaled inner ring v1 = arc.vertices v2 = arc.vertices[::-1] * float(self.r - self.width) / self.r v = np.vstack([v1, v2, v1[0, :], (0, 0)]) c = np.hstack([arc.codes, arc.codes, connector, Path.CLOSEPOLY]) c[len(arc.codes)] = connector else: # Wedge doesn't need an inner ring v = np.vstack([arc.vertices, [(0, 0), arc.vertices[0, :], (0, 0)]]) c = np.hstack([arc.codes, [connector, connector, Path.CLOSEPOLY]]) # Shift and scale the wedge to the final location. v *= self.r v += np.asarray(self.center) self._path = Path(v, c)
Example #16
Source File: patches.py From Computable with MIT License | 5 votes |
def set_connectionstyle(self, connectionstyle, **kw): """ Set the connection style. *connectionstyle* can be a string with connectionstyle name with optional comma-separated attributes. Alternatively, the attrs can be probided as keywords. set_connectionstyle("arc,angleA=0,armA=30,rad=10") set_connectionstyle("arc", angleA=0,armA=30,rad=10) Old attrs simply are forgotten. Without argument (or with connectionstyle=None), return available styles as a list of strings. """ if connectionstyle is None: return ConnectionStyle.pprint_styles() if isinstance(connectionstyle, ConnectionStyle._Base): self._connector = connectionstyle elif callable(connectionstyle): # we may need check the calling convention of the given function self._connector = connectionstyle else: self._connector = ConnectionStyle(connectionstyle, **kw)
Example #17
Source File: sankey.py From twitter-stock-recommendation with MIT License | 4 votes |
def _add_output(self, path, angle, flow, length): """ Append an output to a path and return its tip and label locations. .. note:: *flow* is negative for an output. """ if angle is None: return [0, 0], [0, 0] else: x, y = path[-1][1] # Use the last point as a reference. tipheight = (self.shoulder - flow / 2) * self.pitch if angle == RIGHT: x += length tip = [x + tipheight, y + flow / 2.0] path.extend([(Path.LINETO, [x, y]), (Path.LINETO, [x, y + self.shoulder]), (Path.LINETO, tip), (Path.LINETO, [x, y - self.shoulder + flow]), (Path.LINETO, [x, y + flow]), (Path.LINETO, [x - self.gap, y + flow])]) label_location = [tip[0] + self.offset, tip[1]] else: # Vertical x += self.gap if angle == UP: sign = 1 else: sign = -1 tip = [x - flow / 2.0, y + sign * (length + tipheight)] if angle == UP: quadrant = 3 else: quadrant = 0 # Inner arc isn't needed if inner radius is zero if self.radius: path.extend(self._arc(quadrant=quadrant, cw=angle == UP, radius=self.radius, center=(x - self.radius, y + sign * self.radius))) else: path.append((Path.LINETO, [x, y])) path.extend([(Path.LINETO, [x, y + sign * length]), (Path.LINETO, [x - self.shoulder, y + sign * length]), (Path.LINETO, tip), (Path.LINETO, [x + self.shoulder - flow, y + sign * length]), (Path.LINETO, [x - flow, y + sign * length])]) path.extend(self._arc(quadrant=quadrant, cw=angle == DOWN, radius=self.radius - flow, center=(x - self.radius, y + sign * self.radius))) path.append((Path.LINETO, [x - flow, y + sign * flow])) label_location = [tip[0], tip[1] + sign * self.offset] return tip, label_location
Example #18
Source File: sankey.py From twitter-stock-recommendation with MIT License | 4 votes |
def _add_input(self, path, angle, flow, length): """ Add an input to a path and return its tip and label locations. """ if angle is None: return [0, 0], [0, 0] else: x, y = path[-1][1] # Use the last point as a reference. dipdepth = (flow / 2) * self.pitch if angle == RIGHT: x -= length dip = [x + dipdepth, y + flow / 2.0] path.extend([(Path.LINETO, [x, y]), (Path.LINETO, dip), (Path.LINETO, [x, y + flow]), (Path.LINETO, [x + self.gap, y + flow])]) label_location = [dip[0] - self.offset, dip[1]] else: # Vertical x -= self.gap if angle == UP: sign = 1 else: sign = -1 dip = [x - flow / 2, y - sign * (length - dipdepth)] if angle == DOWN: quadrant = 2 else: quadrant = 1 # Inner arc isn't needed if inner radius is zero if self.radius: path.extend(self._arc(quadrant=quadrant, cw=angle == UP, radius=self.radius, center=(x + self.radius, y - sign * self.radius))) else: path.append((Path.LINETO, [x, y])) path.extend([(Path.LINETO, [x, y - sign * length]), (Path.LINETO, dip), (Path.LINETO, [x - flow, y - sign * length])]) path.extend(self._arc(quadrant=quadrant, cw=angle == DOWN, radius=flow + self.radius, center=(x + self.radius, y - sign * self.radius))) path.append((Path.LINETO, [x - flow, y + sign * flow])) label_location = [dip[0], dip[1] - sign * self.offset] return dip, label_location
Example #19
Source File: sankey.py From twitter-stock-recommendation with MIT License | 4 votes |
def _arc(self, quadrant=0, cw=True, radius=1, center=(0, 0)): """ Return the codes and vertices for a rotated, scaled, and translated 90 degree arc. Optional keyword arguments: =============== ========================================== Keyword Description =============== ========================================== *quadrant* uses 0-based indexing (0, 1, 2, or 3) *cw* if True, clockwise *center* (x, y) tuple of the arc's center =============== ========================================== """ # Note: It would be possible to use matplotlib's transforms to rotate, # scale, and translate the arc, but since the angles are discrete, # it's just as easy and maybe more efficient to do it here. ARC_CODES = [Path.LINETO, Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CURVE4] # Vertices of a cubic Bezier curve approximating a 90 deg arc # These can be determined by Path.arc(0,90). ARC_VERTICES = np.array([[1.00000000e+00, 0.00000000e+00], [1.00000000e+00, 2.65114773e-01], [8.94571235e-01, 5.19642327e-01], [7.07106781e-01, 7.07106781e-01], [5.19642327e-01, 8.94571235e-01], [2.65114773e-01, 1.00000000e+00], # Insignificant # [6.12303177e-17, 1.00000000e+00]]) [0.00000000e+00, 1.00000000e+00]]) if quadrant == 0 or quadrant == 2: if cw: vertices = ARC_VERTICES else: vertices = ARC_VERTICES[:, ::-1] # Swap x and y. elif quadrant == 1 or quadrant == 3: # Negate x. if cw: # Swap x and y. vertices = np.column_stack((-ARC_VERTICES[:, 1], ARC_VERTICES[:, 0])) else: vertices = np.column_stack((-ARC_VERTICES[:, 0], ARC_VERTICES[:, 1])) if quadrant > 1: radius = -radius # Rotate 180 deg. return list(zip(ARC_CODES, radius * vertices + np.tile(center, (ARC_VERTICES.shape[0], 1))))
Example #20
Source File: sankey.py From CogAlg with MIT License | 4 votes |
def _add_output(self, path, angle, flow, length): """ Append an output to a path and return its tip and label locations. .. note:: *flow* is negative for an output. """ if angle is None: return [0, 0], [0, 0] else: x, y = path[-1][1] # Use the last point as a reference. tipheight = (self.shoulder - flow / 2) * self.pitch if angle == RIGHT: x += length tip = [x + tipheight, y + flow / 2.0] path.extend([(Path.LINETO, [x, y]), (Path.LINETO, [x, y + self.shoulder]), (Path.LINETO, tip), (Path.LINETO, [x, y - self.shoulder + flow]), (Path.LINETO, [x, y + flow]), (Path.LINETO, [x - self.gap, y + flow])]) label_location = [tip[0] + self.offset, tip[1]] else: # Vertical x += self.gap if angle == UP: sign = 1 else: sign = -1 tip = [x - flow / 2.0, y + sign * (length + tipheight)] if angle == UP: quadrant = 3 else: quadrant = 0 # Inner arc isn't needed if inner radius is zero if self.radius: path.extend(self._arc(quadrant=quadrant, cw=angle == UP, radius=self.radius, center=(x - self.radius, y + sign * self.radius))) else: path.append((Path.LINETO, [x, y])) path.extend([(Path.LINETO, [x, y + sign * length]), (Path.LINETO, [x - self.shoulder, y + sign * length]), (Path.LINETO, tip), (Path.LINETO, [x + self.shoulder - flow, y + sign * length]), (Path.LINETO, [x - flow, y + sign * length])]) path.extend(self._arc(quadrant=quadrant, cw=angle == DOWN, radius=self.radius - flow, center=(x - self.radius, y + sign * self.radius))) path.append((Path.LINETO, [x - flow, y + sign * flow])) label_location = [tip[0], tip[1] + sign * self.offset] return tip, label_location
Example #21
Source File: sankey.py From CogAlg with MIT License | 4 votes |
def _add_input(self, path, angle, flow, length): """ Add an input to a path and return its tip and label locations. """ if angle is None: return [0, 0], [0, 0] else: x, y = path[-1][1] # Use the last point as a reference. dipdepth = (flow / 2) * self.pitch if angle == RIGHT: x -= length dip = [x + dipdepth, y + flow / 2.0] path.extend([(Path.LINETO, [x, y]), (Path.LINETO, dip), (Path.LINETO, [x, y + flow]), (Path.LINETO, [x + self.gap, y + flow])]) label_location = [dip[0] - self.offset, dip[1]] else: # Vertical x -= self.gap if angle == UP: sign = 1 else: sign = -1 dip = [x - flow / 2, y - sign * (length - dipdepth)] if angle == DOWN: quadrant = 2 else: quadrant = 1 # Inner arc isn't needed if inner radius is zero if self.radius: path.extend(self._arc(quadrant=quadrant, cw=angle == UP, radius=self.radius, center=(x + self.radius, y - sign * self.radius))) else: path.append((Path.LINETO, [x, y])) path.extend([(Path.LINETO, [x, y - sign * length]), (Path.LINETO, dip), (Path.LINETO, [x - flow, y - sign * length])]) path.extend(self._arc(quadrant=quadrant, cw=angle == DOWN, radius=flow + self.radius, center=(x + self.radius, y - sign * self.radius))) path.append((Path.LINETO, [x - flow, y + sign * flow])) label_location = [dip[0], dip[1] - sign * self.offset] return dip, label_location
Example #22
Source File: sankey.py From CogAlg with MIT License | 4 votes |
def _arc(self, quadrant=0, cw=True, radius=1, center=(0, 0)): """ Return the codes and vertices for a rotated, scaled, and translated 90 degree arc. Optional keyword arguments: =============== ========================================== Keyword Description =============== ========================================== *quadrant* uses 0-based indexing (0, 1, 2, or 3) *cw* if True, clockwise *center* (x, y) tuple of the arc's center =============== ========================================== """ # Note: It would be possible to use matplotlib's transforms to rotate, # scale, and translate the arc, but since the angles are discrete, # it's just as easy and maybe more efficient to do it here. ARC_CODES = [Path.LINETO, Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CURVE4] # Vertices of a cubic Bezier curve approximating a 90 deg arc # These can be determined by Path.arc(0,90). ARC_VERTICES = np.array([[1.00000000e+00, 0.00000000e+00], [1.00000000e+00, 2.65114773e-01], [8.94571235e-01, 5.19642327e-01], [7.07106781e-01, 7.07106781e-01], [5.19642327e-01, 8.94571235e-01], [2.65114773e-01, 1.00000000e+00], # Insignificant # [6.12303177e-17, 1.00000000e+00]]) [0.00000000e+00, 1.00000000e+00]]) if quadrant == 0 or quadrant == 2: if cw: vertices = ARC_VERTICES else: vertices = ARC_VERTICES[:, ::-1] # Swap x and y. elif quadrant == 1 or quadrant == 3: # Negate x. if cw: # Swap x and y. vertices = np.column_stack((-ARC_VERTICES[:, 1], ARC_VERTICES[:, 0])) else: vertices = np.column_stack((-ARC_VERTICES[:, 0], ARC_VERTICES[:, 1])) if quadrant > 1: radius = -radius # Rotate 180 deg. return list(zip(ARC_CODES, radius * vertices + np.tile(center, (ARC_VERTICES.shape[0], 1))))
Example #23
Source File: sankey.py From coffeegrindsize with MIT License | 4 votes |
def _add_output(self, path, angle, flow, length): """ Append an output to a path and return its tip and label locations. .. note:: *flow* is negative for an output. """ if angle is None: return [0, 0], [0, 0] else: x, y = path[-1][1] # Use the last point as a reference. tipheight = (self.shoulder - flow / 2) * self.pitch if angle == RIGHT: x += length tip = [x + tipheight, y + flow / 2.0] path.extend([(Path.LINETO, [x, y]), (Path.LINETO, [x, y + self.shoulder]), (Path.LINETO, tip), (Path.LINETO, [x, y - self.shoulder + flow]), (Path.LINETO, [x, y + flow]), (Path.LINETO, [x - self.gap, y + flow])]) label_location = [tip[0] + self.offset, tip[1]] else: # Vertical x += self.gap if angle == UP: sign = 1 else: sign = -1 tip = [x - flow / 2.0, y + sign * (length + tipheight)] if angle == UP: quadrant = 3 else: quadrant = 0 # Inner arc isn't needed if inner radius is zero if self.radius: path.extend(self._arc(quadrant=quadrant, cw=angle == UP, radius=self.radius, center=(x - self.radius, y + sign * self.radius))) else: path.append((Path.LINETO, [x, y])) path.extend([(Path.LINETO, [x, y + sign * length]), (Path.LINETO, [x - self.shoulder, y + sign * length]), (Path.LINETO, tip), (Path.LINETO, [x + self.shoulder - flow, y + sign * length]), (Path.LINETO, [x - flow, y + sign * length])]) path.extend(self._arc(quadrant=quadrant, cw=angle == DOWN, radius=self.radius - flow, center=(x - self.radius, y + sign * self.radius))) path.append((Path.LINETO, [x - flow, y + sign * flow])) label_location = [tip[0], tip[1] + sign * self.offset] return tip, label_location
Example #24
Source File: sankey.py From coffeegrindsize with MIT License | 4 votes |
def _add_input(self, path, angle, flow, length): """ Add an input to a path and return its tip and label locations. """ if angle is None: return [0, 0], [0, 0] else: x, y = path[-1][1] # Use the last point as a reference. dipdepth = (flow / 2) * self.pitch if angle == RIGHT: x -= length dip = [x + dipdepth, y + flow / 2.0] path.extend([(Path.LINETO, [x, y]), (Path.LINETO, dip), (Path.LINETO, [x, y + flow]), (Path.LINETO, [x + self.gap, y + flow])]) label_location = [dip[0] - self.offset, dip[1]] else: # Vertical x -= self.gap if angle == UP: sign = 1 else: sign = -1 dip = [x - flow / 2, y - sign * (length - dipdepth)] if angle == DOWN: quadrant = 2 else: quadrant = 1 # Inner arc isn't needed if inner radius is zero if self.radius: path.extend(self._arc(quadrant=quadrant, cw=angle == UP, radius=self.radius, center=(x + self.radius, y - sign * self.radius))) else: path.append((Path.LINETO, [x, y])) path.extend([(Path.LINETO, [x, y - sign * length]), (Path.LINETO, dip), (Path.LINETO, [x - flow, y - sign * length])]) path.extend(self._arc(quadrant=quadrant, cw=angle == DOWN, radius=flow + self.radius, center=(x + self.radius, y - sign * self.radius))) path.append((Path.LINETO, [x - flow, y + sign * flow])) label_location = [dip[0], dip[1] - sign * self.offset] return dip, label_location
Example #25
Source File: sankey.py From coffeegrindsize with MIT License | 4 votes |
def _arc(self, quadrant=0, cw=True, radius=1, center=(0, 0)): """ Return the codes and vertices for a rotated, scaled, and translated 90 degree arc. Optional keyword arguments: =============== ========================================== Keyword Description =============== ========================================== *quadrant* uses 0-based indexing (0, 1, 2, or 3) *cw* if True, clockwise *center* (x, y) tuple of the arc's center =============== ========================================== """ # Note: It would be possible to use matplotlib's transforms to rotate, # scale, and translate the arc, but since the angles are discrete, # it's just as easy and maybe more efficient to do it here. ARC_CODES = [Path.LINETO, Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CURVE4] # Vertices of a cubic Bezier curve approximating a 90 deg arc # These can be determined by Path.arc(0,90). ARC_VERTICES = np.array([[1.00000000e+00, 0.00000000e+00], [1.00000000e+00, 2.65114773e-01], [8.94571235e-01, 5.19642327e-01], [7.07106781e-01, 7.07106781e-01], [5.19642327e-01, 8.94571235e-01], [2.65114773e-01, 1.00000000e+00], # Insignificant # [6.12303177e-17, 1.00000000e+00]]) [0.00000000e+00, 1.00000000e+00]]) if quadrant == 0 or quadrant == 2: if cw: vertices = ARC_VERTICES else: vertices = ARC_VERTICES[:, ::-1] # Swap x and y. elif quadrant == 1 or quadrant == 3: # Negate x. if cw: # Swap x and y. vertices = np.column_stack((-ARC_VERTICES[:, 1], ARC_VERTICES[:, 0])) else: vertices = np.column_stack((-ARC_VERTICES[:, 0], ARC_VERTICES[:, 1])) if quadrant > 1: radius = -radius # Rotate 180 deg. return list(zip(ARC_CODES, radius * vertices + np.tile(center, (ARC_VERTICES.shape[0], 1))))
Example #26
Source File: sankey.py From Computable with MIT License | 4 votes |
def _arc(self, quadrant=0, cw=True, radius=1, center=(0, 0)): """ Return the codes and vertices for a rotated, scaled, and translated 90 degree arc. Optional keyword arguments: =============== ========================================== Keyword Description =============== ========================================== *quadrant* uses 0-based indexing (0, 1, 2, or 3) *cw* if True, clockwise *center* (x, y) tuple of the arc's center =============== ========================================== """ # Note: It would be possible to use matplotlib's transforms to rotate, # scale, and translate the arc, but since the angles are discrete, # it's just as easy and maybe more efficient to do it here. ARC_CODES = [Path.LINETO, Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CURVE4] # Vertices of a cubic Bezier curve approximating a 90 deg arc # These can be determined by Path.arc(0,90). ARC_VERTICES = np.array([[1.00000000e+00, 0.00000000e+00], [1.00000000e+00, 2.65114773e-01], [8.94571235e-01, 5.19642327e-01], [7.07106781e-01, 7.07106781e-01], [5.19642327e-01, 8.94571235e-01], [2.65114773e-01, 1.00000000e+00], # Insignificant #[6.12303177e-17, 1.00000000e+00]]) [0.00000000e+00, 1.00000000e+00]]) if quadrant == 0 or quadrant == 2: if cw: vertices = ARC_VERTICES else: vertices = ARC_VERTICES[:, ::-1] # Swap x and y. elif quadrant == 1 or quadrant == 3: # Negate x. if cw: # Swap x and y. vertices = np.column_stack((-ARC_VERTICES[:, 1], ARC_VERTICES[:, 0])) else: vertices = np.column_stack((-ARC_VERTICES[:, 0], ARC_VERTICES[:, 1])) if quadrant > 1: radius = -radius # Rotate 180 deg. return zip(ARC_CODES, radius * vertices + np.tile(center, (ARC_VERTICES.shape[0], 1)))
Example #27
Source File: sankey.py From Computable with MIT License | 4 votes |
def _add_input(self, path, angle, flow, length): """ Add an input to a path and return its tip and label locations. """ if angle is None: return [0, 0], [0, 0] else: x, y = path[-1][1] # Use the last point as a reference. dipdepth = (flow / 2) * self.pitch if angle == RIGHT: x -= length dip = [x + dipdepth, y + flow / 2.0] path.extend([(Path.LINETO, [x, y]), (Path.LINETO, dip), (Path.LINETO, [x, y + flow]), (Path.LINETO, [x + self.gap, y + flow])]) label_location = [dip[0] - self.offset, dip[1]] else: # Vertical x -= self.gap if angle == UP: sign = 1 else: sign = -1 dip = [x - flow / 2, y - sign * (length - dipdepth)] if angle == DOWN: quadrant = 2 else: quadrant = 1 # Inner arc isn't needed if inner radius is zero if self.radius: path.extend(self._arc(quadrant=quadrant, cw=angle == UP, radius=self.radius, center=(x + self.radius, y - sign * self.radius))) else: path.append((Path.LINETO, [x, y])) path.extend([(Path.LINETO, [x, y - sign * length]), (Path.LINETO, dip), (Path.LINETO, [x - flow, y - sign * length])]) path.extend(self._arc(quadrant=quadrant, cw=angle == DOWN, radius=flow + self.radius, center=(x + self.radius, y - sign * self.radius))) path.append((Path.LINETO, [x - flow, y + sign * flow])) label_location = [dip[0], dip[1] - sign * self.offset] return dip, label_location
Example #28
Source File: sankey.py From python3_ios with BSD 3-Clause "New" or "Revised" License | 4 votes |
def _add_output(self, path, angle, flow, length): """ Append an output to a path and return its tip and label locations. .. note:: *flow* is negative for an output. """ if angle is None: return [0, 0], [0, 0] else: x, y = path[-1][1] # Use the last point as a reference. tipheight = (self.shoulder - flow / 2) * self.pitch if angle == RIGHT: x += length tip = [x + tipheight, y + flow / 2.0] path.extend([(Path.LINETO, [x, y]), (Path.LINETO, [x, y + self.shoulder]), (Path.LINETO, tip), (Path.LINETO, [x, y - self.shoulder + flow]), (Path.LINETO, [x, y + flow]), (Path.LINETO, [x - self.gap, y + flow])]) label_location = [tip[0] + self.offset, tip[1]] else: # Vertical x += self.gap if angle == UP: sign = 1 else: sign = -1 tip = [x - flow / 2.0, y + sign * (length + tipheight)] if angle == UP: quadrant = 3 else: quadrant = 0 # Inner arc isn't needed if inner radius is zero if self.radius: path.extend(self._arc(quadrant=quadrant, cw=angle == UP, radius=self.radius, center=(x - self.radius, y + sign * self.radius))) else: path.append((Path.LINETO, [x, y])) path.extend([(Path.LINETO, [x, y + sign * length]), (Path.LINETO, [x - self.shoulder, y + sign * length]), (Path.LINETO, tip), (Path.LINETO, [x + self.shoulder - flow, y + sign * length]), (Path.LINETO, [x - flow, y + sign * length])]) path.extend(self._arc(quadrant=quadrant, cw=angle == DOWN, radius=self.radius - flow, center=(x - self.radius, y + sign * self.radius))) path.append((Path.LINETO, [x - flow, y + sign * flow])) label_location = [tip[0], tip[1] + sign * self.offset] return tip, label_location
Example #29
Source File: sankey.py From python3_ios with BSD 3-Clause "New" or "Revised" License | 4 votes |
def _add_input(self, path, angle, flow, length): """ Add an input to a path and return its tip and label locations. """ if angle is None: return [0, 0], [0, 0] else: x, y = path[-1][1] # Use the last point as a reference. dipdepth = (flow / 2) * self.pitch if angle == RIGHT: x -= length dip = [x + dipdepth, y + flow / 2.0] path.extend([(Path.LINETO, [x, y]), (Path.LINETO, dip), (Path.LINETO, [x, y + flow]), (Path.LINETO, [x + self.gap, y + flow])]) label_location = [dip[0] - self.offset, dip[1]] else: # Vertical x -= self.gap if angle == UP: sign = 1 else: sign = -1 dip = [x - flow / 2, y - sign * (length - dipdepth)] if angle == DOWN: quadrant = 2 else: quadrant = 1 # Inner arc isn't needed if inner radius is zero if self.radius: path.extend(self._arc(quadrant=quadrant, cw=angle == UP, radius=self.radius, center=(x + self.radius, y - sign * self.radius))) else: path.append((Path.LINETO, [x, y])) path.extend([(Path.LINETO, [x, y - sign * length]), (Path.LINETO, dip), (Path.LINETO, [x - flow, y - sign * length])]) path.extend(self._arc(quadrant=quadrant, cw=angle == DOWN, radius=flow + self.radius, center=(x + self.radius, y - sign * self.radius))) path.append((Path.LINETO, [x - flow, y + sign * flow])) label_location = [dip[0], dip[1] - sign * self.offset] return dip, label_location
Example #30
Source File: sankey.py From python3_ios with BSD 3-Clause "New" or "Revised" License | 4 votes |
def _arc(self, quadrant=0, cw=True, radius=1, center=(0, 0)): """ Return the codes and vertices for a rotated, scaled, and translated 90 degree arc. Optional keyword arguments: =============== ========================================== Keyword Description =============== ========================================== *quadrant* uses 0-based indexing (0, 1, 2, or 3) *cw* if True, clockwise *center* (x, y) tuple of the arc's center =============== ========================================== """ # Note: It would be possible to use matplotlib's transforms to rotate, # scale, and translate the arc, but since the angles are discrete, # it's just as easy and maybe more efficient to do it here. ARC_CODES = [Path.LINETO, Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CURVE4] # Vertices of a cubic Bezier curve approximating a 90 deg arc # These can be determined by Path.arc(0,90). ARC_VERTICES = np.array([[1.00000000e+00, 0.00000000e+00], [1.00000000e+00, 2.65114773e-01], [8.94571235e-01, 5.19642327e-01], [7.07106781e-01, 7.07106781e-01], [5.19642327e-01, 8.94571235e-01], [2.65114773e-01, 1.00000000e+00], # Insignificant # [6.12303177e-17, 1.00000000e+00]]) [0.00000000e+00, 1.00000000e+00]]) if quadrant == 0 or quadrant == 2: if cw: vertices = ARC_VERTICES else: vertices = ARC_VERTICES[:, ::-1] # Swap x and y. elif quadrant == 1 or quadrant == 3: # Negate x. if cw: # Swap x and y. vertices = np.column_stack((-ARC_VERTICES[:, 1], ARC_VERTICES[:, 0])) else: vertices = np.column_stack((-ARC_VERTICES[:, 0], ARC_VERTICES[:, 1])) if quadrant > 1: radius = -radius # Rotate 180 deg. return list(zip(ARC_CODES, radius * vertices + np.tile(center, (ARC_VERTICES.shape[0], 1))))