Skip to content

Commit b98621a

Browse files
Add option for relative units for arc radius
1 parent 2f7c6b7 commit b98621a

File tree

2 files changed

+64
-95
lines changed

2 files changed

+64
-95
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import numpy as np
2+
import matplotlib.pyplot as plt
3+
from matplotlib.patches import Arc
4+
from matplotlib.transforms import IdentityTransform
5+
6+
class AngleArc(Arc):
7+
def __init__(self, xy, vec1, vec2, size=100, units="pixels", ax=None, fig=None, **kwargs):
8+
self._xydata = xy # in data coordinates
9+
self.ax = ax or plt.gca()
10+
self.fig = fig or plt.gcf()
11+
self.vec1 = vec1 # tuple or array of coordinates, relative to xy
12+
self.vec2 = vec2 # tuple or array of coordinates, relative to xy
13+
self.size = size
14+
15+
super().__init__(self._xydata, size, size, angle=0.0,
16+
theta1=self.theta1, theta2=self.theta2, **kwargs)
17+
18+
self.set_transform(IdentityTransform())
19+
20+
if units == "relative":
21+
fig.canvas.mpl_connect("resize_event", self._resize)
22+
23+
self.ax.add_patch(self)
24+
25+
def _resize(self, event):
26+
x0, y0 = self.ax.transAxes.transform((0, 0))
27+
x1, y1 = self.ax.transAxes.transform((1, 1))
28+
dx = x1 - x0
29+
dy = y1 - y0
30+
smallest = min(dx, dy)
31+
self.width = 0.25*dx
32+
self.height = 0.25*dx
33+
34+
def get_center_pixels(self):
35+
""" return center in pixel coordinates """
36+
return self.ax.transData.transform(self._xydata)
37+
38+
def set_center(self, xy):
39+
""" set center in data coordinates """
40+
self._xydata = xy
41+
42+
_center = property(get_center_pixels, set_center)
43+
44+
def get_theta(self, vec):
45+
vec_in_pixels = self.ax.transData.transform(vec) - self._center
46+
return np.rad2deg(np.arctan2(vec_in_pixels[1], vec_in_pixels[0]))
47+
48+
def get_theta1(self):
49+
return self.get_theta(self.vec1)
50+
51+
def get_theta2(self):
52+
return self.get_theta(self.vec2)
53+
54+
def set_theta(self, angle):
55+
pass
56+
57+
theta1 = property(get_theta1, set_theta)
58+
theta2 = property(get_theta2, set_theta)
59+
60+
fig, ax = plt.subplots()
61+
62+
ax.plot([2,.5,1],[0,.2,1])
63+
am = AngleArc((0.5, 0.2), (2, 0), (1, 1), size=100, units="relative", ax=ax, fig=fig)
64+
plt.show()

examples/lines_bars_and_markers/angle_arc.py

-95
This file was deleted.

0 commit comments

Comments
 (0)