雷达图
霍兰德认为人格兴趣与职业之间有一种内在的对应的关系。我们需要绘制雷达图,并且展示第三方数据。(编译错误AttributeError: Unknown property frac在文章结尾)
matplotlib.rcParams[‘font.family’]='SimHei’意为将图片中的字体设置为SimHei,matplotlib.rcParams[‘font.family’]为设置字体。
numpy.array([]),意为设置多维数组,python是有array功能的,但是仅仅可以定义一维数组,并不能定义多维数组,而numpy库提供了多维数组的定义。radar_labels、data均可以用这种方法定义,data_labels则是一组元组。
angles=np.linspace表示要获得一组等差的数列,使用方法如下:numpy.linspace(start, stop, num=50, endpoint=True),表示以start为起点,stop为结束点,中间一共取num个点,可以不填num,若不填,则默认为50,且num为非负的值。endpoint=True,则取的点中包括结束点,endpoint=False,则取的点中不包括技术点,例如以下的例子:
np.linspace(2.0, 3.0, num=5)
array([ 2. , 2.25, 2.5 , 2.75, 3. ])
np.linspace(2.0, 3.0, num=5, endpoint=False)
array([ 2. , 2.2, 2.4, 2.6, 2.8])
numpy.pi为numpy库中的Π值,所以这里的angles=np.linspace(0,2*np.pi,nAttr,endpoint=False)表示以0为起始点,2Π为结束点,不包含结束点一共取nAttr个点。
np.concatenate函数:我们这里讲解一下拼接函数的三种方法:
1、先将数组转换为列表,后用列表的拼接函数append()、extend()进行拼接,最后将列表转换为数组。如下:import numpy as np
x=np.array([0,1,2])
y=np.array([5,6,7])
listx=list(x)
listy=list(y)listx.extend(listy)
listx
[0,1,2,5,6,7]
x=np.array(listx)
x
array([0,1,2,5,6,7])
这种方法适用于简单的拼接,因为过程过于繁琐,且浪费处理的时间 。在运行程序中,我们为了更直观,加入print函数进行输出显示。
import numpy as np
x=np.array([0,1,2])
y=np.array([5,6,7])
print(x,y)
listx=list(x)
listy=list(y)
listx.extend(listy)
print(listx)
x=np.array(listx)
print(x)
结果为:
2、numpy库中有numpy.append(arr, values, axis=None)函数。对参数有一定的限制:数组和数值或者两个数组,不能三个以上的数组进行直接的append函数拼接。
import numpy as np
x=np.array([0,1,2])
y=np.array([5,6,7])
np.append(x,317)
array([0,1,2,317])
x
array([0,1,2])
np.append(x,y)
array([0,1,2,5,6,7])
A=array([[0,1,2],[3,4,5]])
B=np.array([[10,11,12],[13,14,15]])
np.append(A,B)
array([0,1,2,3,4,5,10,11,12,13,14,15])
numpy的数组是不会一直更新数组的,numpy.append()函数会重新分配数组。
import numpy as np
x=np.array([0,1,2])
y=np.array([5,6,7])
print(x,y)
t=np.append(x,317)
print(t,x)
k=np.append(x,y)
print(k)
A=np.array([[0,1,2],[3,4,5]])
B=np.array([[10,11,12],[13,14,15]])
u=np.append(A,B)
print(u)
print(A)
结果如下:
3、利用numpy.concatenate((a1,a2,…), axis=0)函数。能够一次完成多个数组的拼接。
import numpy as np
x=np.array([0,1,2,3])
y=np.array([4,5,6])
z=np.array([7,8,9,0])
np.concatenate((x,y,z),axis=0) #axis=0不写则默认为0
array([0,1,2,3,4,5,6,7,8,9,0]) #对一维数组的拼接,axis的值不影响结果
A=np.array([[0,1,2],[3,4,5]])
B=np.array([[100,101,102],[103,104,105]])
np.concatenate((A,B),axis=0)#axis=0表示直接进行拼接
array([[0,1,2],
[3,4,5],
[100,101,102],
[103,104,105]])
np.concatenate((A,B),axis=1) #axis=1表示对应行的数组进行拼接
array([[0,1,2,100,101,102],
[3,4,5,103,104,105]])
import numpy as np
x=np.array([0,1,2,3])
y=np.array([4,5,6])
z=np.array([7,8,9,0])
k=np.concatenate((x,y,z),axis=0)
print(x,y,z)
print(k)
#axis=0不写则默认为0
#对一维数组的拼接,axis的值不影响结果
A=np.array([[0,1,2],[3,4,5]])
B=np.array([[100,101,102],[103,104,105]])
t=np.concatenate((A,B),axis=0)#axis=0表示直接进行拼接
print(A,B)
print(t)
p=np.concatenate((A,B),axis=1)
#axis=1表示对应行的数组进行拼接
print(p)
结果如下:
plt.figure(facecolor=’white’)为将图形的背景颜色设置为白色,如果不写,默认是rc figure.facecolor。其他参数如下表所示:
fig.add_subplot(111, projection=‘polar’),意为添加一个极坐标的图。
plt.plot(x,y,string,*k)表示以x为横轴、y为纵轴,string有很多可以选择的参数,我们这里只介绍程序中出现的,*k也有许多可以选取的。
(其他参数可以参考:https://blog.csdn.net/qq_15264999/article/details/80862216)。
plt.plot(angles,data,‘o-’,linewidth=1,alpha=0.2)表示以angles为横轴数据,data为纵轴数据,’-0’表示实线实心圈标记。alpha表示透明度(是浮点值),值从0-1不等,0为透明,1为不透明。linewidth表示线宽,为浮点值。
matplotlib.pyplot.fill(args,kwargs):绘制填充图,填充x轴和曲线y之间区域。ax.fill(x1,y1,‘g’,x2,y2,‘r’)返回Polygon属性
plt.thetagrids方法用于设置极坐标角度网格线显示,参数为所要显示网格线的角度值列表,且默认显示0°、45°、90°、135°、180°、225°、270°、315°的网格线。plt.thetagrids(angles180/np.pi,radar_labels)即为在angles180/Π的角度上标上为radar_labels的标签。(原本为角度)plt.figtext(x,y, txt, size=12) 在figure中的任意位置添加文本,前面两个参数是指定位置。plt.figtext(0.52,0.95,‘霍兰德人格分析’,ha=‘center’,size=20),意思为在0.52,0.95的位置处添加’霍兰德人格分析’的文本,字大小为20。
plt.legend(*args, **kwargs),为一般形式plt.legend(data_labels,loc=(0.94,0.80),labelspacing=0.1)表示将数据data_labels添加至位置为(0.94,0.80),图例条目之间的垂直间距为0.1。
用plt.setp()命令来进行设置,该命令可以对一个列表或者单个对象进行设置。
plt.grid(True) 意思为显示背景的网格线。
使用plt.savefig()保存的图片。
plt.show()用来显示图像。
完整代码如下:
#霍兰德人格分析雷达图
#HollandRadarDraw
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family']='SimHei'
radar_labels=np.array(['研究型(I)','艺术型(A)','社会型(S)',\
'企业型(E)','常规型(C)','现实型(R)'])
#雷达标签
nAttr=6
data=np.array([[0.40,0.32,0.35,0.30,0.30,0.88],
[0.85,0.35,0.30,0.40,0.40,0.30],
[0.43,0.89,0.30,0.28,0.22,0.30],
[0.30,0.25,0.48,0.85,0.45,0.40],
[0.20,0.38,0.87,0.45,0.32,0.28],
[0.34,0.31,0.38,0.40,0.92,0.28]])
#数据值
data_labels=('艺术家','实验员','工程师','推销员','社会工作者','记事员')
angles=np.linspace(0,2*np.pi,nAttr,endpoint=False)
data=np.concatenate((data,[data[0]]))
angles=np.concatenate((angles,[angles[0]]))
fig=plt.figure(facecolor="white")
plt.subplot(111,polar=True)
plt.plot(angles,data,'o-',linewidth=1,alpha=0.2)
plt.fill(angles,data,alpha=0.25)
plt.thetagrids(angles*180/np.pi,radar_labels)
plt.figtext(0.52,0.95,'霍兰德人格分析',ha='center',size=20)
legend=plt.legend(data_labels,loc=(0.94,0.80),labelspacing=0.1)
plt.setp(legend.get_texts(),fontsize='large')
plt.grid(True)
plt.savefig('holland_radar.jpg')
plt.show()
错误分析:
我在编写代码的时候发现,以原有的(网课中的源代码)代码编写,会出现以下错误:
错误类型为:
raise AttributeError(‘Unknown property %s’ % k)
AttributeError: Unknown property frac
AttributeError: Unknown property frac:属性错误:未知属性frac。
出现这个错误的原因是网课的python库是旧版本的,在最新的python中,库的函数有一些参数发生了一定的变化,比如在plt.thetagrids函数中,没有frac参数了。
改进方法:将frac=1.2去掉即可,运行程序就能正常运行了。