, . , ! , - , .. - , .
, matplotlib.transforms.Transform . , , , , , .
, " ", , .
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
class MyTransform(mpl.transforms.Transform):
input_dims = 2
output_dims = 2
def __init__(self, base_point, base_transform, offset, *kargs, **kwargs):
self.base_point = base_point
self.base_transform = base_transform
self.offset = offset
super(mpl.transforms.Transform, self).__init__(*kargs, **kwargs)
def transform_non_affine(self, values):
new_base_point = self.base_transform.transform(self.base_point)
t = mpl.transforms.Affine2D().translate(-new_base_point[0], -new_base_point[1])
values = t.transform(values)
x = values[:, 0:1]
y = values[:, 1:2]
r = np.sqrt(x**2+y**2)
new_r = r-self.offset
new_r[new_r<0] = 0.0
new_x = new_r/r*x
new_y = new_r/r*y
return t.inverted().transform(np.concatenate((new_x, new_y), axis=1))
def my_plot(X,Y):
ax = plt.gca()
line, = ax.plot(X, Y, marker='o', linestyle='')
color = line.get_color()
size = X.size
for i in range(1,size):
mid_x = (X[i]+X[i-1])/2
mid_y = (Y[i]+Y[i-1])/2
t = ax.transData
my_t = MyTransform(base_point=(mid_x, mid_y), base_transform=t, offset=10)
t_end = t + my_t
line, = ax.plot(
[X[i-1], X[i]],
[Y[i-1], Y[i]],
linestyle='-', color=color)
line.set_transform(t_end)
fig = plt.figure(figsize=(8,6))
axes = plt.subplot(111)
X = np.linspace(0,2*np.pi, 8)
Y = np.sin(X)
my_plot(X,Y)
plt.show()
