如何使用matplotlib和python使用五角大楼网格制作雷达蜘蛛图?

如何使用matplotlib和python使用五角大楼网格制作雷达蜘蛛图?,python,matplotlib,radar-chart,Python,Matplotlib,Radar Chart,我有雷达图。需要将网格从圆形形式更改为五边形形式。目前,我有以下输出: 而我希望smth是这样的: 以下是我拥有的系统的信息:Windows10(64位);Python-3.8.0(32位);matplotlib-3.3。 我在这里看到的这个问题:但它不能解决我的问题。 但这对我不起作用,我不明白为什么。我可以简单地复制代码,但结果是-外部边界更改为五角大楼形式,但内部网格线保持圆形。但它对其他人有效 程序代码如下: 将numpy导入为np 将matplotlib.pyplot作为plt导入

我有雷达图。需要将网格从圆形形式更改为五边形形式。目前,我有以下输出:

而我希望smth是这样的:

以下是我拥有的系统的信息:Windows10(64位);Python-3.8.0(32位);matplotlib-3.3。 我在这里看到的这个问题:但它不能解决我的问题。 但这对我不起作用,我不明白为什么。我可以简单地复制代码,但结果是-外部边界更改为五角大楼形式,但内部网格线保持圆形。但它对其他人有效

程序代码如下:

将numpy导入为np
将matplotlib.pyplot作为plt导入
从matplotlib.patches导入圆形、规则多边形
从matplotlib.path导入路径
从matplotlib.projections.polar导入PolarAxes
从matplotlib.projections导入寄存器\u projection
从matplotlib.spines导入脊椎
从matplotlib.transforms导入仿射2D
def雷达工厂(数值变量,帧='圆圈'):
“”“使用'num_vars'轴创建雷达图。
此函数用于创建RadarAxes投影并对其进行注册。
参数
----------
数值变量:int
雷达图的变量数。
框架:{‘圆’|‘多边形}
围绕轴的框架形状。
"""
#计算均匀分布的轴角度
θ=np.linspace(0,2*np.pi,num_vars,endpoint=False)
雷达类(PolarAxes):
名称=‘雷达’
定义初始化(self,*args,**kwargs):
super()
#旋转绘图,使第一个轴位于顶部
self.set_theta_zero_位置('N')
def加注(自身,*args,关闭=真,**kwargs):
“”“覆盖填充,以便在默认情况下关闭行”“”
return super().fill(closed=closed,*args,**kwargs)
def绘图(自身、*args、**kwargs):
“”“覆盖打印,使线在默认情况下关闭”“”
lines=super().plot(*args,**kwargs)
对于行中的行:
自我关闭线(线)
def关闭管路(自身,管路):
x、 y=行。获取_数据()
#修正:x[0],y[0]处的标记加倍
如果x[0]!=x[-1]:
x=np.concatenate((x[x[0]]))
y=np.concatenate((y[y[0]]))
行。设置_数据(x,y)
def set_varlabels(自我,标签):
自设置坐标(np.度数(θ),标签)
def_gen_轴_贴片(自):
#轴面片必须以(0.5,0.5)为中心,半径为0.5
#在坐标轴中。
如果帧=='圆':
返回圆((0.5,0.5,0.5)
elif frame==“多边形”:
返回规则多边形((0.5,0.5),数值变量,半径=0.5,edgecolor=“k”)
其他:
raise VALUERROR(“帧”的未知值:%s“%frame”)
def绘制(自绘制、渲染器):
“”“绘制。如果框架为多边形,则将网格线设置为多边形形状”“”
如果frame=='polygon':
gridlines=self.yaxis.get\u gridlines()
对于网格线中的总账:
gl.get_path()。_插值_步数=num_变量
super().draw(渲染器)
定义根轴棘(自身):
如果帧=='圆':
返回super()。\u gen\u axes\u spines()
elif frame==“多边形”:
#脊椎类型必须为“左”/“右”/“上”/“下”/“圆”。
脊椎=脊椎(轴=自身,
脊椎_type='circle',
路径=路径。单位\规则\多边形(数值\变量))
#单位_正_多边形给出半径为1的多边形,以
#(0,0)但是我们想要一个半径为0.5,以(0.5)为中心的多边形,
#0.5)在轴坐标中。
spine.set_变换(仿射2D().缩放(.5).平移(.5,.5)
+自动变速箱(自动变速箱)
返回{'polar':spine}
其他:
raise VALUERROR(“帧”的未知值:%s“%frame”)
寄存器_投影(雷达X)
返回θ
数据=['O1','O2','O3','O4','O5'],
(“头衔”[
[4, 3.5, 4, 2, 3,], 
[1.07, 5.95, 2.04, 1.05, 0.00,], 
]
)]
N=len(数据[0])
θ=雷达工厂(N,frame='polygon')#多边形!!!
辐条标签=data.pop(0)
标题,案例\数据=数据[0]
图,ax=plt.子批次(图尺寸=(5,5),子批次_kw=dict(投影=(雷达)))
图子批次调整(顶部=0.85,底部=0.05)
ax.set_rgrids([0,1,2.0,3.0,4.0,5.0,6])
ax.set_title(title,position=(0.5,1.1),ha='center')
对于案例_数据中的d:
直线=最大曲线图(θ,d)
最大填充(θ,d,α=0.25)
ax.set_varlabels(轮辐标签)
plt.show()

我投票决定重新讨论这个问题。虽然ImportanceOfBeingEarnest链接的脚本在Python3.6/matplotlib3.2.2上可以正常工作,但在Python3.8/matplolib3.3.3中,对于内部网格线,我也得到了不同的输出?似乎它只适用于python 3.7版和更早版本。不,我只是在python 3.6中存储了matplotlib 3.2.2。很可能某些matplotlib版本发生了更改,可能是脚本如何将
gl.get\u path().\u interpolation\u steps=num\u vars
挂接到渲染器中。渲染器有一些更改,但我不熟悉细节。@JohanC抱歉,我还认为应该重新打开该问题。是的,降级到matplotlib 3.2.2将恢复以前的行为。升级到3.3.3中的某些内容改变了极坐标图网格线的生成方式,现在
\u interpolation\u steps
被标准值覆盖。matplotlib文档中说,Tbf