matplotlib下用雷达图+散点图实现分类图表

        新手上路。有的时候有一项作业需求是要做一个图表,来直观地反应各种情况的分布情况,原数据中一个标签有八种情况分类和4个级别的两种分类。原本的图是手工在PPT中一个一个排的,我觉得太慢了就想弄一个程序来自动生成,虽然自己不是很熟练,查来查去没有现成的只能自己想办法写一个,最终效果如下:

         代码段,因为实际使用时需求方有比较多的变化需求,有时候要5级有时候要调整项数,所以代码段较散没有精炼,保持较高的调整空间。

        先是运用了xlrd包,在excel读取处理好的数据,三列,分为两种类别,一个是严重程度(1,2,3,4),另一个是所属归类(八类),另一个是标签。遍历判断,各种情况按照实现设定的判断条件设定好坐标数值加入到准备好的空列表中。

        要先构建需要的雷达图,八瓣和四级。再加入散点图,调整好散点图坐标与点的形式与内容连接方式。最后再自己加入文本位置就可以了。

        

​
import numpy as np
import matplotlib.pyplot as plt
import xlrd
# 设置中文显示与字体选择,可能库版本不同会没有雅黑字体
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 设置画布大小
plt.figure(figsize=(10.0, 10.0))


 
excel_path = ""#指定文件的路径
 
#打开文件,获取excel文件的workbook(工作簿)对象
excel = xlrd.open_workbook(excel_path,encoding_override="utf-8")

excel_file = xlrd.open_workbook(excel_path)   # 打开Excel文件

#获取sheet对象
all_sheet = excel.sheets()


#循环遍历每个sheet对象
for sheet in all_sheet:

    i1 = sheet.col_values(0)#打印指定的第一列,设定为i1
 
    
    i2 = sheet.col_values(1)#打印指定的第二列
    
    
    i3 = sheet.col_values(2)#打印指定的第三列


x =[]
yx =[]
y =[]

#判断相应的标签在极坐标中所对应的区域,用角度来划定在角度上的范围,用random.uniform来随机取数解决重叠问题,append加到x轴中

for a in i1:
    if a == '界面设计':
        x.append(np.random.uniform(5/180*np.pi,40/180*np.pi))
    elif a == '视觉呈现':
        x.append(np.random.uniform(50/180*np.pi,85/180*np.pi))
    elif a == '系统反馈':
        x.append(np.random.uniform(95/180*np.pi,130/180*np.pi))
    elif a == '内容需求':
        x.append(np.random.uniform(140/180*np.pi,175/180*np.pi))
    elif a == '功能需求':
        x.append(np.random.uniform(185/180*np.pi,220/180*np.pi))
    elif a == '信息架构':
        x.append(np.random.uniform(230/180*np.pi,265/180*np.pi))
    elif a == '交互设计':
        x.append(np.random.uniform(275/180*np.pi,310/180*np.pi))
    elif a == '信息设计':
        x.append(np.random.uniform(320/180*np.pi,355/180*np.pi))

#判断在y轴上的位置,加到y轴中

for c in i3:
    if c == 1:
        y.append(np.random.uniform(0.3,0.8))
    elif c == 2:
        y.append(np.random.uniform(1.3,1.8))
    elif c == 3:
        y.append(np.random.uniform(2.3,2.8))
    elif c == 4:
        y.append(np.random.uniform(3.3,3.8))
    elif c == 5:
        y.append(np.random.uniform(4.3,4.8))


angles = range(0, 360, 45)
labels = ('', '', '', '', '', '', '', '')#标签设置为八个,内容为空
plt.polar()

plt.thetagrids(angles, labels)

#加入散点图,颜色红色,形状为方块,透明度为0.3

plt.scatter(x,y,s=500,color='red',marker='s',alpha=0.3 )

#控制标签文本,用zip取出并且打包xy坐标数据和文本内容i2,

for m,n,b in zip(x,y,i2):
    plt.annotate('%s' % b,
                 xy=(m,n),
                 xytext=(0, 3),
                 
                 textcoords='offset points',
                 ha='center',      # 点在注释文本的中心
                 va='top')         # 点在注释文本的上方
    
#文本不想在轴上,自己加标签位置设定。角度,y值,文本,大小
plt.text(22.5/180*np.pi, 4.3, '文本',fontsize= 20)
plt.text(67.5/180*np.pi, 4.3, '文本',fontsize= 20)
plt.text(127/180*np.pi, 4.9, '文本',fontsize= 20)
plt.text(165/180*np.pi, 5.6, '文本',fontsize= 20)
plt.text(195/180*np.pi, 5.5, '文本',fontsize= 20)
plt.text(235/180*np.pi, 5.1, '文本',fontsize= 20)
plt.text(290/180*np.pi, 4.5, '文本',fontsize= 20)
plt.text(335/180*np.pi, 4.4, '文本',fontsize= 20)

#控制刻度范围,步数
w = list(range(0,5,1))
plt.yticks(w)


plt.show()

​

第一次写,不详尽,也没有那么熟练,有些方法用得比较笨,后续想到继续完善。

看着实在是太乱太丑了受不了,学了一些前端和JavaScript,用Echats做一个可交互的出来了,见下一篇。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值