python - 使用 matplotlib 正确旋转和对齐标签
问题描述
以下代码将一些点放在平面上,并从中心到每个点绘制一条线。对于每个点,都有一个标签,并希望将标签放在该点之后。因此,从中心,我们看到一条线,然后是一个点,然后是一个文本。我想将标签与直线的斜率相同。
目前,我有这个代码,但你可以看到旋转的文本没有正确对齐。我该如何解决?
import matplotlib.pyplot as plt
import numpy as np
from math import *
a = np.array([
[-0.108,0.414],
[0.755,-0.152],
[0.871,-0.039],
],)
labels = ["XXXXXXX", "YYYYYY", "ZZZZZZZ"]
x, y = a.T
plt.scatter(x, y)
plt.xlim(-1,1)
plt.ylim(-1,1)
ax = plt.axes()
for i in range(a.shape[0]):
px = a[i,0]
py = a[i,1]
ax.arrow(0, 0, px, py, head_width=0, head_length=0.1, length_includes_head=True)
angle = degrees(atan(py/px))
ax.annotate(labels[i], (px, py), rotation=angle)
plt.grid(True)
plt.show()
更新:
我使用了此处提出的解决方案并进行了修改
text_plot_location = np.array([0.51,0.51])
trans_angle = plt.gca().transData.transform_angles(np.array((45,)),text_plot_location.reshape((1,2)))[0]
ax.annotate(labels[i], (px, py), rotation=text_plot_location)
但是,我收到此错误TypeError: unhashable type: 'numpy.ndarray'
解决方案
不理想,但更接近你想要的。缺点是文本偏移的任意值 30 点适用于给定标签,但需要针对更长或更短的标签进行调整。
import matplotlib.pyplot as plt
import numpy as np
from math import *
a = np.array([[-0.108,0.414],[0.755,-0.152],[0.871,-0.039]])
labels = ["XXXXXXX", "YYYYYY", "ZZZZZZZ"]
x, y = a.T
plt.scatter(x, y)
plt.xlim(-1,1)
plt.ylim(-1,1)
ax = plt.axes()
for i in range(a.shape[0]):
px = a[i,0]
py = a[i,1]
ax.arrow(0, 0, px, py, head_width=0, head_length=0.1, length_includes_head=True)
angle = atan(py/px)
d = (-1 if px < 0 else 1) * 30
ax.annotate(labels[i], (px, py), rotation=degrees(angle), textcoords="offset points",
xytext=(d*cos(angle), d*sin(angle)),
verticalalignment='center', horizontalalignment='center')
plt.grid(True)
plt.show()
推荐阅读
- git - 如果提交消息包含特殊字符,则通过完全匹配提交消息来搜索 git 提交
- regex - 以 1 '.csv' 模式结尾的字符串的正则表达式
- r - 在 R 数据框的 2 列中查找字符串之间的交集
- angular - Angular:在可重用/清洁方法中将 API 数据转换为新的数据类型
- c# - 使用 RTL 时带有 C# acroforms 展平问题的 IText 7
- angular - 如何在 Angular HTTPClient 中处理流
- css - Tailwind:配置配置文件后如何访问默认内容?
- java - 检测在自定义键盘(IME)Android之外按下的EditText
- c - 在C中,如何使用链表打印结构中的所有值,而这个结构是嵌套的?
- python - 当运行 yad2k 生成模型 h5 文件时,“tensorflow”在 tensorflow 2.3 中没有属性“space_to_depth”错误