美国约翰霍普金斯大学霍兰德教授认为,个人职业兴趣特性与职业之间应有一种内在的对应关系。根据兴趣的不同,人格可分为研究型(I)、艺术型(A)、社会型(S)、企业型(E)、传统型(C)、现实型(R)六个维度,每个人的性格都是这六个维度的不同程度组合。
展示霍兰德人格分析最有效的工具是雷达图,以工程师、实验员、艺术家、推销员、社会工作者、记事员6个职业数据为例,利用Python第三方库matplotlib绘制雷达图。
代码示例
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['font.sans-serif']=['SimHei'] #为了正确显示中文字体,将字体更改为黑体‘SimHei’
data_labels=np.array(['工程师','实验员','艺术家','推销员','社会工作者','记事员'])
n=6
radar_labels=np.array([' 研究型(I)','艺术型(A)','社会型(S)',\
'企业型(E) ','常规型(C)','现实型(R)']) # 为了美观加了几个空格
data=np.array([[0.40,0.32,0.35,0.30,0.30,0.88], #6种职业数据,列表元素为列表
[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]])
angles=np.linspace(0,2*np.pi,n,endpoint=False) #将360度平均分为n个部分(有endpoint=False分为6个部分,反之5个部分)
data=np.concatenate((data,[data[0]]))
angles=np.concatenate((angles,[angles[0]]))
plt.figure(facecolor='white') #绘制全局绘图区域
plt.subplot(111,polar=True) #绘制一个1行1列极坐标系子图,当前位置为1
plt.figtext(0.52,0.95,'霍兰德人格分析',ha='center',size=20) #放置标题 ,ha是horizontalalignment(水平对齐方式)的缩写
plt.thetagrids(angles*180/np.pi,radar_labels) #放置属性(radar_labels)
plt.plot(angles,data,'o-',linewidth=1.5,alpha=0.2) #连线,画出不规则六边形
plt.fill(angles,data,alpha=0.25) #填充,alpha是透明度(自己的实践理解)
legend=plt.legend(data_labels,loc=(0.94,0.80),labelspacing=0.1) #放置图注(右上角)
plt.setp(legend.get_texts(),fontsize='small')
plt.grid(True) #打开坐标网格
plt.show() #显示
总结
1、正确显示字体的设置方式
2、列表元素可以为列表
3、endpoint=False
4、np.concatenate()函数:将数据(data)和角度(angles)的数组首尾闭合。(不是很明白)
5、polar参数指定了绘制类型为极坐标这是subplot()除默认正方形坐标系外唯一支持的内置坐标图。
6、了解plot()参数,o是多边形的空心顶点(加粗),- 表示多边形的边加粗实线 。
7、thetagrids()需要有angles,labels参数,由于我使用的是python3.6,没有frac属性。
thetagrids()添加frac属性后,报错:AttributeError: ‘Text’ object has no property ‘frac’
这是属性错误。
参考资料:
嵩天、礼欣、黄天羽著 《Python语言程序设计基础(第2版)》 高等教育出版社 2017
如有错误,敬请指正。