下面的代码在平面上放置一些点,并从中心到每个点绘制一条线。对于每个点,都有一个标签,并希望将标签放在该点之后。因此,从中心开始,我们看到一条线,然后是一个点,然后是一个文本。我想把标签与直线的斜率相同。
目前,我有这个代码,但正如你所看到的,旋转的文本没有正确对齐。我该怎么弥补?
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()
更新:
我使用了提出的解决方案here和修改
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'
3条答案
按热度按时间wnavrhmk1#
不是很理想,但更接近你想要的。缺点是文本偏移量的任意值为30点,该值适用于给定的标签,但需要针对更长或更短的标签进行调整。
xsuvu9jc2#
@mapf的链接稍微干净一点,但这是我想出来的:
我不知道为什么Angular 不完全匹配的线。
vltsax253#
您在更新中犯了一个简单的错误。您需要将
trans_angle
传递给rotation
而不是text_plot_location
关键字,但是,我不确定结果是否是您想要的。