Python 在圆周围放置文本

Python 在圆周围放置文本,python,matplotlib,Python,Matplotlib,使用pyplotcircle函数我制作了一个圆,然后使用text函数将文本(参数)放置在圆上(附图)但问题是,如果我只想列出6个或11个参数,这些参数在圆上等距分布,我必须改变坐标以及文本中的旋转(并且坐标和旋转值已经手动设置)。我想要一个能自动处理这些事情的东西,比如给定一个参数,它会在圆周围以相等的间距放置参数 导入matplotlib.pyplot作为plt 从matplotlib.patches导入多边形 图,ax=plt.子批次(图尺寸=(30,20)) ax.轴(“相等”) ax.s

使用pyplot
circle
函数我制作了一个圆,然后使用
text
函数将文本(参数)放置在圆上(附图)但问题是,如果我只想列出6个或11个参数,这些参数在圆上等距分布,我必须改变坐标以及
文本中的旋转(并且坐标和旋转值已经手动设置)。我想要一个能自动处理这些事情的东西,比如给定一个参数,它会在圆周围以相等的间距放置参数

导入matplotlib.pyplot作为plt
从matplotlib.patches导入多边形
图,ax=plt.子批次(图尺寸=(30,20))
ax.轴(“相等”)
ax.set(xlim=(-10,23),ylim=(-10,10))
圆=plt.圆((0,0),4.7,fc='#cfe2f3')
ax.添加补片(圆形)
ax.text(-0.4,4.9,'npxG',fontsize=15)
ax.text(3.35,3.5,'xA',旋转=310,字体大小=15)
ax.text(4.8,-0.5,'目标射击',旋转=270,字体大小=15)
最大文本(3.35,-3.55,‘运球’,旋转=50,字体大小=15)
ax.text(-1,-5.,“贯穿球”,fontsize=15)
最大文本(-4.6,-3.6,'通过1/3',旋转=305,字体大小=15)
ax.text(-5,-0.5,'键传递',旋转=90,字体大小=15)
最大文本(-4,3.3,'交叉',旋转=42,字体大小=15)
ax.轴(“关闭”)

编辑:

范围内的i(0,len(数据)):
a=点[i,2]
x、 y=(半径*np.sin(a),半径*np.cos(a))
a=a-0.5*np.pi
如果点[i,1]<0:
a=a-np.pi
ax.text(x,y,数据[i],旋转=np.rad2deg(a),ha=“center”,va=“center”,fontsize=15)
更改阵列顺序时:

翻转x和y值时:

使用代码,从问答和一些坐标几何中获得灵感:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(30, 20))
ax.axis('equal')

ax.set(xlim=(-10, 10), ylim=(-10, 10))

circle = plt.Circle((0, 0), 2.7, fc='#cfe2f3')
ax.add_patch(circle)

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]


data = ["npxG", "xA", "Shots on Target", "Dribbles", "Through Balls", 
        "Passes 1/3", "Key Passes", "Crosses"]
radius = 3.2
points = kex(len(data))

for i in range(0, len(data)):
    a = points[i,2] 
    x,y = (radius*np.cos(a), radius*np.sin(a))
    if points[i,0] < 0:
      a = a - np.pi
    ax.text(x, y, data[i], ha="center", va="center", fontsize=15)

ax.axis("off")

plt.show()

注意添加的
rotation
参数。这使得:

要修改问题中的示例图像,请执行以下操作:

for i in range(0, len(data)):
    a = points[i,2] 
    x,y = (radius*np.cos(a), radius*np.sin(a))
    a = a - 0.5*np.pi
    if points[i,1] < 0:
      a = a - np.pi
    ax.text(x, y, data[i], rotation = np.rad2deg(a), ha="center", va="center", fontsize=15)
范围内的i(0,len(数据)):
a=点[i,2]
x、 y=(半径*np.cos(a),半径*np.sin(a))
a=a-0.5*np.pi
如果点[i,1]<0:
a=a-np.pi
ax.text(x,y,数据[i],旋转=np.rad2deg(a),ha=“center”,va=“center”,fontsize=15)
这使得:

列表<代码>数据
可以用标签文本填充。更改标签数量时,绘图应相应调整。参数
radius
调整文本与圆心的距离。您可以根据标签的需要向
.text()
函数中添加额外的参数,例如
fontsize


注意:在白色主题上查看此答案,以清楚地看到标签。我冒昧地更改了绘图大小以适合这里。非常感谢@ImportanceOfBeingErnest提供链接问题的答案。

请为您的问题添加代码以提供MVCE。问题已使用添加的代码和绘图进行更新。嘿,我现在翻转了x和y值,以便标签在给定的数据列表中按顺序显示,例如npxG将位于顶部,然后是xA等等。但是当我翻转x和y值时,旋转似乎不起作用,你能告诉我旋转部分背后的直觉吗?我已经添加了代码,请你检查一下。你找到什么了吗?我不明白你翻转x和y值的意思。请问一个新问题,我所做的是将半径*sin(a)值指定给x,将半径*cos(a)值指定给y,以便参数以这样的方式对齐,即在圆的顶部放置第一个参数(在我的例子中是npxG)。您编写的代码将npxG放在右侧而不是顶部。您可以看到绘图和代码(编辑后附在问题中)。我希望你能明白,你为什么要这么做?相反,只需更改数组的顺序即可。
for i in range(0, len(data)):
    a = points[i,2] 
    x,y = (radius*np.cos(a), radius*np.sin(a))
    a = a - 0.5*np.pi
    if points[i,1] < 0:
      a = a - np.pi
    ax.text(x, y, data[i], rotation = np.rad2deg(a), ha="center", va="center", fontsize=15)