题目
在做python实验作业3的第四题的时候 需要使用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) 下面我给出我的用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进行输出,就可以发现问题所在 很明显,各专业的成绩不再是一开始读取的成绩.
- concatenate函数的背后原理
concatenate函数自动帮我们将其第二个参数作为结束值,也就是在这个list列表的最后,使用了append方法,将第二个参数加入了列表的末尾,从而使得这条线形成闭环,就是说,这个列表的长度不再是原来的长度,而是原来的长度+1 - 解决方案
既然已经知道了是由于长度不同一所导致的结果,那么解决方案自然应该是将labels标签列表的长度变得和他一样就可以了。
labels = values[0][1:]
labels.append(values[0][1])
在labels标签的最后手动append标签的第一个数据(因为第一个数据不是课程名称,所以应该加入的是第二个,也就是索引为1的数据)。这样就可以成功输出了。 希望对大家有所帮助
|