python批量制作雷达图的实现方法


Posted in Python onJuly 26, 2016

前言

因为工作需要有时候要画雷达图,但是数据好多组怎么办?不能一个一个点excel去画吧,那么可以利用python进行批量制作,得到样式如下:

python批量制作雷达图的实现方法

首先制作一个演示的excel,评分为excel随机数生成:

1 =INT((RAND()+4)*10)/10

加入标签等得到的excel样式如下(部分,共计32行):

python批量制作雷达图的实现方法

那么接下来就是打开python写码了,本文是基于pycharm进行编写

 

wb = load_workbook(filename=r'C:\Users\Administrator\Desktop\数据指标.xlsx') ##读取路径
   ws = wb.get_sheet_by_name("Sheet1") ##读取名字为Sheet1的sheet表
 
   info_id = []
   info_first = []
 
   for row_A in range(2, 32): ## 遍历第2行到32行
     id = ws.cell(row=row_A, column=1).value ## 遍历第2行到32行,第1列
     info_id.append(id)
   for col in range(2, 9): ##读取第1到9列
     first = ws.cell(row=1, column=col).value
     info_first.append(first) ##得到1到8列的标签
 
   info_data = []
   for row_num_BtoU in range(2, len(info_id) + 2): ## 遍历第2行到32行
     row_empty = [] ##建立一个空数组作为临时储存地,每次换行就被清空
     for i in range(2, 9): ## 遍历第2行到32行,第2到9列
       data_excel = ws.cell(row=row_num_BtoU, column=i).value
       if data_excel == None:
         pass
       else:
         row_empty.append(data_excel) ##将单元格信息储存进去
     info_data.append(row_empty)

分步讲解:

读取excel表格:

wb = load_workbook(filename=r'C:\Users\Administrator\Desktop\数据指标.xlsx') ##读取路径
   ws = wb.get_sheet_by_name("Sheet1") ##读取名字为Sheet1的sheet表

需要用到库:

 import xlsxwriter

 from openpyxl import load_workbook

在命令指示符下输入:

 pip install xlsxwriter

等待安装即可,后面的库也是如此:

python批量制作雷达图的实现方法

将第一列ID储存,以及第一行的标签,标签下面的数值分别储存在:

info_id = []
  info_first = []
  info_data = []

读取数据后接下来需要设置写入的格式:

workbook = xlsxwriter.Workbook('C:\\Users\\Administrator\\Desktop\\result.xlsx')
   worksheet = workbook.add_worksheet() # 创建一个工作表对象
   #字体格式
   font = workbook.add_format(
     {'border': 1, 'align': 'center', 'font_size': 11, 'font_name': '微软雅黑'}) ##字体居中,11号,微软雅黑,给一般的信息用的
   #写下第一行第一列的标签
   worksheet.write(0, 0, '商品货号', font)
   ##设置图片的那一列宽度
   worksheet.set_column(0, len(info_first) + 1, 11) # 设定第len(info_first) + 1列的宽度为11

将标签数据等写入新的excel表格中:

#新建一个excel保存结果
   workbook = xlsxwriter.Workbook('C:\\Users\\Administrator\\Desktop\\result.xlsx')
   worksheet = workbook.add_worksheet() # 创建一个工作表对象
   #字体格式
   font = workbook.add_format(
     {'border': 1, 'align': 'center', 'font_size': 11, 'font_name': '微软雅黑'}) ##字体居中,11号,微软雅黑,给一般的信息用的
   #写下第一行第一列的标签
   worksheet.write(0, 0, '商品货号', font)
   ##设置图片的那一列宽度
   worksheet.set_column(0, len(info_first) + 1, 11) # 设定第len(info_first) + 1列的宽度为11
 
   ##写入标签
   for k in range(0,7):
     worksheet.write(0, k + 1, info_first[k], font)
   #写入最后一列标签
   worksheet.write(0, len(info_first) + 1, '雷达图', font)

制作雷达图:

#设置雷达各个顶点的名称
   labels = np.array(info_first)
   #数据个数
   data_len = len(info_first)
   for i in range(0,len(info_id)):
     data = np.array(info_data[i])
 
     angles = np.linspace(0, 2*np.pi, data_len, endpoint=False)
     data = np.concatenate((data, [data[0]])) # 闭合
     angles = np.concatenate((angles, [angles[0]])) # 闭合
 
     fig = plt.figure()
     ax = fig.add_subplot(111, polar=True)# polar参数!!
     ax.plot(angles, data, 'bo-', linewidth=2)# 画线
     ax.fill(angles, data, facecolor='r', alpha=0.25)# 填充
     ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")
     ax.set_title("商品货号:" + str(info_id[i]), va='bottom', fontproperties="SimHei")
     ax.set_rlim(3.8,5)# 设置雷达图的范围
     ax.grid(True)
     plt.savefig("C:\\Users\\Administrator\\Desktop\\result\\商品货号:" + str(info_id[i]) + ".png", dpi=120)

图片太大怎么办?用库改变大小即可

import Image
     ##更改图片大小
     infile = “C:\\Users\\Administrator\\Desktop\\result\\商品货号:" + str(info_id[i]) + ".png“
     outfile = ”C:\\Users\\Administrator\\Desktop\\result1\\商品货号:" + str(info_id[i]) + ".png”
     im = Image.open(infile)
     (x, y) = im.size
     x_s = 80  ## 设置长
     y_s = 100  ## 设置宽
     out = im.resize((x_s, y_s), Image.ANTIALIAS)
     out.save(outfile,'png',quality = 95)

将大图片和小图片放在了result和result1两个不同的文件夹,需要再前边创建这两个文件夹:

if os.path.exists(r'C:\\Users\\Administrator\\Desktop\\result'): # 建立一个文件夹在桌面,文件夹为result
     print('result文件夹已经在桌面存在,继续运行程序……')
   else:
     print('result文件夹不在桌面,新建文件夹result')
     os.mkdir(r'C:\\Users\\Administrator\\Desktop\\result')
     print('文件夹建立成功,继续运行程序')
 
   if os.path.exists(r'C:\\Users\\Administrator\\Desktop\\result1'): # 建立一个文件夹在C盘,文件夹为result1
     print('result1文件夹已经在桌面存在,继续运行程序……')
   else:
     print('result1文件夹不在桌面,新建文件夹result1')
     os.mkdir(r'C:\\Users\\Administrator\\Desktop\\result1')
     print('文件夹建立成功,继续运行程序')

最后插入图片到excel中:

worksheet.insert_image(i + 1, len(info_first) + 1, 'C:\\Users\\Administrator\\Desktop\\result1\\' + "商品货号:" + str(info_id[i]) + '.png') ##写入图片
     time.sleep(1)##防止写入太快电脑死机
     plt.close() #  一定要关掉图片,不然python打开图片20个后会崩溃
 
   workbook.close()#最后关闭excel

得到的效果如下:

python批量制作雷达图的实现方法

附上完整代码:

import numpy as np
  import matplotlib.pyplot as plt
  import xlsxwriter
  from openpyxl import load_workbook
  import os
  import time
  from PIL import Image
  
  if __name__ == '__main__':
 
   if os.path.exists(r'C:\\Users\\Administrator\\Desktop\\result'): # 建立一个文件夹在桌面,文件夹为result
     print('result文件夹已经在桌面存在,继续运行程序……')
   else:
     print('result文件夹不在桌面,新建文件夹result')
     os.mkdir(r'C:\\Users\\Administrator\\Desktop\\result')
     print('文件夹建立成功,继续运行程序')
 
   if os.path.exists(r'C:\\Users\\Administrator\\Desktop\\result1'): # 建立一个文件夹在C盘,文件夹为result1
     print('result1文件夹已经在桌面存在,继续运行程序……')
   else:
     print('result1文件夹不在桌面,新建文件夹result1')
     os.mkdir(r'C:\\Users\\Administrator\\Desktop\\result1')
     print('文件夹建立成功,继续运行程序')
 
   wb = load_workbook(filename=r'C:\Users\Administrator\Desktop\数据指标.xlsx') ##读取路径
   ws = wb.get_sheet_by_name("Sheet1") ##读取名字为Sheet1的sheet表
 
   info_id = []
   info_first = []
 
   for row_A in range(2, 32): ## 遍历第2行到32行
     id = ws.cell(row=row_A, column=1).value ## 遍历第2行到32行,第1列
     info_id.append(id)
   for col in range(2, 9): ##读取第1到9列
     first = ws.cell(row=1, column=col).value
     info_first.append(first) ##得到1到8列的标签
   print(info_id)
   print(info_first)
 
   info_data = []
   for row_num_BtoU in range(2, len(info_id) + 2): ## 遍历第2行到32行
     row_empty = [] ##建立一个空数组作为临时储存地,每次换行就被清空
     for i in range(2, 9): ## 遍历第2行到32行,第2到9列
       data_excel = ws.cell(row=row_num_BtoU, column=i).value
       if data_excel == None:
         pass
       else:
         row_empty.append(data_excel) ##将单元格信息储存进去
     info_data.append(row_empty)
   print(info_data)
   print(len(info_data))
 
   # 设置雷达各个顶点的名称
   labels = np.array(info_first)
   # 数据个数
   data_len = len(info_first)
   # 新建一个excel保存结果
   workbook = xlsxwriter.Workbook('C:\\Users\\Administrator\\Desktop\\result.xlsx')
   worksheet = workbook.add_worksheet() # 创建一个工作表对象
   # 字体格式
   font = workbook.add_format(
     {'border': 1, 'align': 'center', 'font_size': 11, 'font_name': '微软雅黑'}) ##字体居中,11号,微软雅黑,给一般的信息用的
   # 写下第一行第一列的标签
   worksheet.write(0, 0, '商品货号', font)
   ##设置图片的那一列宽度
   worksheet.set_column(0, len(info_first) + 1, 11) # 设定第len(info_first) + 1列的宽度为11
 
   ##写入标签
   for k in range(0, 7):
     worksheet.write(0, k + 1, info_first[k], font)
   # 写入最后一列标签
   worksheet.write(0, len(info_first) + 1, '雷达图', font)
 
   # 将其他参数写入excel中
   for j in range(0, len(info_id)):
     worksheet.write(j + 1, 0, info_id[j], font) # 写入商品货号
     worksheet.set_row(j, 76) ##设置行宽
     for x in range(0, len(info_first)):
       worksheet.write(j + 1, x + 1, info_data[j][x], font) # 写入商品的其他参数
 
   for i in range(0, len(info_id)):
     data = np.array(info_data[i])
 
     angles = np.linspace(0, 2 * np.pi, data_len, endpoint=False)
     data = np.concatenate((data, [data[0]])) # 闭合
     angles = np.concatenate((angles, [angles[0]])) # 闭合
 
     fig = plt.figure()
     ax = fig.add_subplot(111, polar=True) # polar参数!!
     ax.plot(angles, data, 'bo-', linewidth=2) # 画线
     ax.fill(angles, data, facecolor='r', alpha=0.25) # 填充
     ax.set_thetagrids(angles * 180 / np.pi, labels, fontproperties="SimHei")
     ax.set_title("商品货号:" + str(info_id[i]), va='bottom', fontproperties="SimHei")
     ax.set_rlim(3.8, 5) # 设置雷达图的范围
     ax.grid(True)
     plt.savefig("C:\\Users\\Administrator\\Desktop\\result\\商品货号:" + str(info_id[i]) + ".png", dpi=120)
     # plt.show()在python中显示
 
     ##更改图片大小
     infile = "C:\\Users\\Administrator\\Desktop\\result\\商品货号:" + str(info_id[i]) + ".png"
     outfile = "C:\\Users\\Administrator\\Desktop\\result1\\商品货号:" + str(info_id[i]) + ".png"
     im = Image.open(infile)
     (x, y) = im.size
     x_s = 80 ## 设置长
     y_s = 100 ## 设置宽
     out = im.resize((x_s, y_s), Image.ANTIALIAS)
     out.save(outfile, 'png', quality=95)
 
     worksheet.insert_image(i + 1, len(info_first) + 1,
                'C:\\Users\\Administrator\\Desktop\\result1\\' + "商品货号:" + str(
                  info_id[i]) + '.png') ##写入图片
     time.sleep(1) ##防止写入太快电脑死机
     plt.close() # 一定要关掉图片,不然python打开图片20个后会崩溃
 
   workbook.close() # 最后关闭excel

以上就是本文介绍利用python批量制作雷达图的实现方法,希望给学习python的大家有所帮助

Python 相关文章推荐
python自动化测试之从命令行运行测试用例with verbosity
Sep 28 Python
Python操作CouchDB数据库简单示例
Mar 10 Python
利用matplotlib+numpy绘制多种绘图的方法实例
May 03 Python
python timestamp和datetime之间转换详解
Dec 11 Python
浅谈django三种缓存模式的使用及注意点
Sep 30 Python
破解安装Pycharm的方法
Oct 19 Python
详解Python3之数据指纹MD5校验与对比
Jun 11 Python
python算法题 链表反转详解
Jul 02 Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 Python
pandas条件组合筛选和按范围筛选的示例代码
Aug 26 Python
tensorflow对图像进行拼接的例子
Feb 05 Python
Python 微信公众号文章爬取的示例代码
Nov 30 Python
python 添加用户设置密码并发邮件给root用户
Jul 25 #Python
Python文件夹与文件的相关操作(推荐)
Jul 25 #Python
浅谈python类属性的访问、设置和删除方法
Jul 25 #Python
python直接访问私有属性的简单方法
Jul 25 #Python
python类:class创建、数据方法属性及访问控制详解
Jul 25 #Python
python实现汉诺塔方法汇总
Jul 25 #Python
python魔法方法-属性访问控制详解
Jul 25 #Python
You might like
php array_unique之后json_encode需要注意
2011/01/02 PHP
PHP编程函数安全篇
2013/01/08 PHP
php用正则判断是否为数字的方法
2016/03/25 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
Jquery加载时从后台读取数据绑定到dropdownList实例
2013/06/09 Javascript
JS操作Cookie写入和读取实例代码
2013/10/20 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
webpack项目轻松混用css module的方法
2018/06/12 Javascript
vue使用监听实现全选反选功能
2018/07/06 Javascript
详解如何在nuxt中添加proxyTable代理
2018/08/10 Javascript
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
2019/01/19 Javascript
JS实现扫码枪扫描二维码功能
2020/01/03 Javascript
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
[01:21]DOTA2周边文化主题展 神秘商店火热开售
2017/07/30 DOTA
[02:44]重置世界,颠覆未来——DOTA2 7.23版本震撼上线
2019/12/01 DOTA
Python字符串详细介绍
2015/05/09 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
如何理解python面向对象编程
2020/06/01 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
html5 拖拽及用 js 实现拖拽功能的示例代码
2020/10/23 HTML / CSS
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
高分子材料个人求职信范文
2013/09/25 职场文书
优秀女职工事迹材料
2014/02/06 职场文书
公司爱心捐款倡议书
2014/05/14 职场文书
党性观念心得体会
2014/09/03 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
2014年学前班工作总结
2014/12/08 职场文书
致接力运动员加油稿
2015/07/21 职场文书
毕业欢送晚会主持词
2019/06/25 职场文书
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android