合工大----python实验作业3----matplotlib踩坑记录----set_thetagrids()

题目

在做python实验作业3的第四题的时候
合工大----python实验作业3----matplotlib踩坑记录----set_thetagrids()_第1张图片
需要使用matplotlib库,在前面的操作都没有太大的问题,在b站找了个教程跟着做,但是在set_thetagrids()函数,也就是给雷达图设置标签的时候出现了bug,这个bug我找了网络上的很多很多资源都没有得到解决,我一开始不知道哪里出错了,甚至我照着视频的代码原封不动打一遍,也会报这个错。
所以我推测set_thetagrids()报错很可能是由于python版本更新后,matplotlib库并没有向下兼容导致的
报错内容如下:
Traceback (most recent call last):
File “Z:@大二上\Python\实验三\T4.py”, line 27, in
ax.set_thetagrids(angles * 180/np.pi, labels)
File “Z:@大二上\Python\venv\lib\site-packages\matplotlib\projections\polar.py”, line 1336, in set_thetagrids
self.set_xticklabels(labels)
合工大----python实验作业3----matplotlib踩坑记录----set_thetagrids()_第2张图片
下面我给出我的用python3.9.5编译成功的代码

import numpy as np
import matplotlib.pyplot as plt
# 中文和负号的正常显示
plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False
# 读取文件
fp = open("./files/scoreRadar.txt",encoding="utf8")
values = []
for readline in fp.readlines():
    values.append(readline.strip().split('\t'))
print(values)
fp.close()
# 构造数据
labels = values[0][1:]
labels.append(values[0][1])
# 设置雷达图的角度,用于平分切开一个平面
angles = np.linspace(0, 2*np.pi, len(values[0][1:]), endpoint=False)
# 使雷达图封闭起来
for i in range(1, len(values)):
    values[i] = np.concatenate((values[i], [values[i][1]]))
angles = np.concatenate((angles, [angles[0]]))
# 绘图
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
for i in values[1:]:
    ax.plot(angles, list(map(int,i[1:])), '.-', linewidth=3)
# 设置标签
ax.set_thetagrids(angles * 180/np.pi, labels)
# 添加标题
plt.title('成绩单分析')
plt.show()

解决方法

  • set_thetagrids方法中的两个参数代表的含义
    set_thetagrids()方法需要两个参量,第一个为角度的列表,第二个为标签列表,也就是说让角度一一对应标签,实现对于雷达图各角度的标签设置。那么很显然,我们至少需要做到的前提就是让标签的个数和角度的个数一致
  • 参数所对应雷达图的数据是什么
    标签所对应的雷达图中的数据,其实就是上面用concatenate()函数分装的数据列表,而这个报错出现的原因也就是concatenate()函数所导致的
for i in range(1, len(values)):
values[i] = np.concatenate((values[i], [values[i][1]]))

我们不妨将这段封装后的values进行输出,就可以发现问题所在
合工大----python实验作业3----matplotlib踩坑记录----set_thetagrids()_第3张图片
很明显,各专业的成绩不再是一开始读取的成绩.

  • concatenate函数的背后原理
    concatenate函数自动帮我们将其第二个参数作为结束值,也就是在这个list列表的最后,使用了append方法,将第二个参数加入了列表的末尾,从而使得这条线形成闭环,就是说,这个列表的长度不再是原来的长度,而是原来的长度+1
  • 解决方案
    既然已经知道了是由于长度不同一所导致的结果,那么解决方案自然应该是将labels标签列表的长度变得和他一样就可以了。
labels = values[0][1:]
labels.append(values[0][1])

在labels标签的最后手动append标签的第一个数据(因为第一个数据不是课程名称,所以应该加入的是第二个,也就是索引为1的数据)。这样就可以成功输出了。
合工大----python实验作业3----matplotlib踩坑记录----set_thetagrids()_第4张图片
希望对大家有所帮助

你可能感兴趣的