我在 pyplot 中的文本对齐方面遇到困难。我试图在圆形树状图中注释以圆形方式排列的点,因此标签远离点并保持直角非常重要。这是我迄今为止所掌握的相关部分。
水平标签很有魅力,但垂直标签显然不太对劲。似乎 horizontalalignment
/verticalalignment
应用于原始坐标和边界框。是否有任何选项/方法可以正确对齐标签,而无需执行一些疯狂的特技,例如计算出文本高度并相应地移动标签。我想知道用极坐标覆盖第二个图/轴并将文本放在上面是否有意义,但我不确定这是否会引导我到任何地方。或者我是否遗漏了一些非常明显的东西......
这是一个最小的工作示例:
import matplotlib.pyplot as plt
(fig, ax) = plt.subplots(figsize = (4,4))
def kex(N):
alpha = 360. / N
coordX = []
coordY = []
alphas = []
for i in range(0,N):
alpha_loop = alpha * i
coordX.append( math.cos(math.radians(alpha_loop)) )
coordY.append( math.sin(math.radians(alpha * i)) )
alphas.append(alpha_loop)
return [coordX, coordY, alphas]
N = 10
points = kex(N)
ax.scatter(points[0], points[1])
for i in range(0,N):
x = points[0][i]
y = points[1][i]
a = points[2][i]
if x > 0:
ax.text(x + x * 0.1, y + y * 0.1, "AAA", rotation = a,
bbox=dict(facecolor = "none", edgecolor ="red"))
else:
ax.text(x + x * 0.1, y + y * 0.1, "AAA", rotation = a - 180,
bbox=dict(facecolor = "none", edgecolor ="red"), ha = "right")
ax.axis("off")
plt.show()
感谢任何帮助!
最佳答案
您可以将文本偏移得足够大,以免其与点重叠。然后,想法是将文本居中对齐(ha="center", va="center"
),这样文本将位于图形中点和点之间的延长(虚拟)线上它注释。
import matplotlib.pyplot as plt
import numpy as np
(fig, ax) = plt.subplots(figsize = (4,4))
def kex(N):
alpha=2*np.pi/N
alphas = alpha*np.arange(N)
coordX = np.cos(alphas)
coordY = np.sin(alphas)
return np.c_[coordX, coordY, alphas]
N = 10
r = 1.2
points = kex(N)
ax.scatter(points[:,0], points[:,1])
for i in range(0,N):
a = points[i,2]
x,y = (r*np.cos(a), r*np.sin(a))
if points[i,0] < 0: a = a - np.pi
ax.text(x,y, "AAA", rotation = np.rad2deg(a), ha="center", va="center",
bbox=dict(facecolor = "none", edgecolor ="red"))
ax.axis("off")
plt.show()
关于python - 将标签对齐在一个圆圈中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43919803/