python - 使用定义的锚点添加图片以进行绘图
问题描述
我正在使用 Python,并且想知道使用任何库的最简单方法是使用图像上定义的点将图像添加到绘图以连接到绘图上的特定点。
将图片添加到绘图的每个部分以使图片上的红点锚定到该部分的坐标的最简单方法是什么?此外,我需要能够改变图片的方向,即窄部分朝上或朝下。
这是我使用方向向量生成线段的类代码,即[“TOP”,“BOTTOM”,“TOP”,“TOP”,“BOTTOM”,...]
class Limb:
delta_L = 0.3
theta = radians(8)
def __init__(self, size=15, length=1):
self.length = length
self.size = size
self.XY = np.zeros((2, size+1))
def build(self, orient_vec):
self.curvature = 0
delta_length = self.length + Limb.delta_L
theta_vec = np.zeros((self.size+1))
if len(orient_vec) != self.size:
exception_string = (
'Orientation vector size must equal limb size.\n' +
'Orientation vector size:\t{}\n'.format(
len(orient_vec)) + 'Limb size:\t{}\n'.format(self.size)
)
raise Exception(exception_string)
else:
for ind, seg in enumerate(orient_vec, 1):
if seg == "TOP":
angle = theta_vec[ind-1] + Limb.theta
self.XY[0, ind] = self.XY[0, ind-1] + \
(delta_length * cos(angle))
self.XY[1, ind] = self.XY[1, ind-1] + \
(delta_length * sin(angle))
self.curvature += Limb.theta
theta_vec[ind] = theta_vec[ind-1] + 2*(Limb.theta)
elif seg == "BOTTOM":
angle = theta_vec[ind-1] - Limb.theta
self.XY[0, ind] = self.XY[0, ind-1] + \
(delta_length * cos(angle))
self.XY[1, ind] = self.XY[1, ind-1] + \
(delta_length * sin(angle))
theta_vec[ind] = theta_vec[ind-1] - 2*(Limb.theta)
self.curvature -= Limb.theta
else:
upto = ind
break
upto = ind
if self.XY.sum() <= 0:
return
else:
self.XY = np.delete(self.XY, np.s_[upto:], 1)
所以要重现情节运行这个:
from . import Limb
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.ticker import MultipleLocator
import numpy as np
limb = Limb()
orientation_vector = ["TOP", "BOTTOM", "TOP", "TOP",
"BOTTOM", "TOP", "BOTTOM", "TOP", "TOP", "BOTTOM", "TOP", "BOTTOM", "TOP", "TOP", "BOTTOM", ]
limb.build(orientation_vector)
segs = limb.XY.shape[1]
points = limb.XY
fig, ax = plt.subplots()
ax.plot([0, 0], [-2, 2], color='black')
ax.xaxis.set_major_locator(MultipleLocator(1))
ax.plot(points[0, :], points[1, :], color='red')
ax.set_aspect('equal', adjustable='datalim')
plt.show()
解决方案
对于那些想要做类似事情的人,我用它来帮助imshow_affine
:
一步一步:
1. 打开图像
2. 计算线段中点
3.imshow_affine
用于添加图像到绘图
4. 确定窄部分是在顶部还是底部,因为需要添加 180 度旋转
5. 使用matplotlib.transforms.Affine2D().rotate_deg_around
和matplotlib.transforms.Affine2D().translate
图像正确旋转和定位。请记住将此转换设置为.set_transform
推荐阅读
- node.js - 如何验证我的会话中的时隙冲突?
- ruby-on-rails - 导入时找不到 Rails 模型
- python - RegEx 匹配特定字符串中的所有匹配项
- powershell - 如何按计算机模型族过滤并运行模型族特定任务?
- javascript - AOS js 库无法在 Angular/Ionic App 中向下滚动
- java - 如何使用 Eclipse 打开和执行 Maven 项目?
- reactjs - Webpack 构建错误。配置对象无效。目标参数无效
- javascript - 如何将文本保存到本地存储,并访问它并将其附加到链接网页上的 OL
- mysql - 如果没有插入到sql中,则更新记录,如果它存在
- python - 如何在 Playwright 中使用 Xpath 与 iframe 交互