分享

作图详解 | 利用Python绘制技术功效图的方法(第二辑)

 豆豆samuel 2018-03-04

上一篇我们利用Python画了气泡图(相关链接:作图详解 | 利用Python绘制技术功效图的方法,本期的教程是将气泡矩阵图原来的气泡变成饼图或环图,从而使技术功效气泡图增加一个新的数据分析维度。

感谢上一篇读者Zoe,Nano的留言和建议,这次我们的程序增加了数据标签的显示功能,插入了可选择R语言ggplot绘图风格的语句,并改进了自动添加坐标,这个版本的程序不需要再手动在程序里逐一键入坐标轴上的“技术手段”和“技术效果”啦,可以自动对应Excel坐标生成横纵坐标标签。


糖果色气泡饼/气泡环自动生成方法:

STEP 1:

将Excel(示例数据:百度网盘链接:https://pan.baidu.com/s/1eSvoBVc,密码: v5vw)按照如下格式准备好。

Excel包含多个工作表,第一个工作表中是技术功效表,其中的数据大小代表气泡的大小(也就是饼图或者环图大小),如下图所示:

其他的工作表中是每一个细分技术领域(技术手段和技术效果相对应的细分技术领域)中的文献分布,比如可以是该细分技术领域的主要申请人、主要国家、或是专利的法律状态等,如下图所示:

将该Excel表命名为“散饼数据表.xlsx”。如果你要修改这个Excel表的名称,那么对应的修改程序中的“散饼数据表.xlsx”即可。

STEP2:

1) 将程序复制粘贴至spyder中的源程序编辑器(单击file,new file,跳出一个新文件)

2) 复制程序,修改读入excel名称、设置图片标题(修改“XXX”改为所需的领域):


3) 保存,单击F5或者绿色向右的小箭头。

得到如下效果:

矩阵气泡饼图


矩阵气泡饼图

中心红色数据为该环的数据量总和,三个黑色数据为不同部分的数据量:


是不是很简单呢~



“矩阵气泡饼图”程序及说明如下:

import numpy as np #导入python的数值计算扩展包numpy,并重命名为np

import matplotlib.pyplot as plt #导入Python的绘图扩展包matplotlib,并重新命名为plt

import pandas as pd #导入python的数据处理扩展包pandas,并重命名为pd,该包用于读写excel文件

import matplotlib.patches as mpatches

#plt.style.use('ggplot')#打开或者关闭R语言风格绘图 

 

sheet1=pd.read_excel('散饼数据表.xlsx','工作表1')#从excel的工作表1中读出数据,sheet名称根据实际情况修改

x=[i 1for i in range(len(sheet1.columns))]#获取数据表的列,作为x轴辅助绘图数据

y_index=[i for i inrange(len(sheet1.index))]#获取纵轴有多少行

y = [[i for y_data in range(len(x))] for i in range(1,len(y_index) 1)]#生成y轴辅助数据

 

fig, ax = plt.subplots()#创建子图

colors = ['gold', 'lightcoral', 'lightskyblue','yellowgreen']#颜色列表

ax.set(aspect='equal')#设置图形的对称,不然饼会椭圆

 

for index in range(len(y_index)):#对转置后的每一列进行循环

   for i,j,r inzip(x,y[index],sheet1.T[sheet1.index[index]]):#循环执行,每次从x,y[index]中读取一个数,从转置后的excel表格中读取一列中的一个数据

       sheet=pd.read_excel('散饼数据表.xlsx',str(sheet1.columns[i-1]) str(sheet1.index[index]))#从excel中的相应sheet中读取数据,根据excel中的工作表名修改

       ifr/max(sheet1.max())/2 < 0.2:

            ax.pie(sheet['数量'], explode=None, labels=None, colors='w',

     autopct='%d', shadow=False, startangle=90,radius=1/2,center=(i, j),frame=True,textprops={'fontsize':8})#绘制散饼图

            ax.pie(sheet['数量'], explode=None, labels=None, colors=colors,

     autopct=None, shadow=False, startangle=90,radius=r/max(sheet1.max())/2,center=(i,j),frame=True)

       else:

            ax.pie(sheet['数量'], explode=None, labels=None, colors=colors,

     autopct='%d', shadow=False, startangle=90,radius=r/max(sheet1.max())/2,center=(i,j),frame=True,textprops={'fontsize':8})#绘制散饼图,面积大小由radius调节。

           

       #ax.pie([1], radius=np.sqrt(r/np.pi)/30/2,colors='w',center=(i,j),frame=True)#增加甜甜圈的圈,圈大小由radius调节

       #ax.text(i,j,str(r),fontsize=int(np.sqrt(r/np.pi)*0.8),

       #       horizontalalignment='center',verticalalignment='center')#增加数据标签,字体大小由fontsize调节

     

plt.grid(True)#增加栅格  

plt.xlabel('技术手段分类',size=14)#x轴说明

plt.ylabel('技术效果',size=14)#y轴说明

plt.title('XXX领域技术功效分析',size=14)#图片名称

plt.xticks(x,sheet1.columns)#利用excel表中的表格横轴更新x轴标度

plt.yticks([i 1for i inrange(len(sheet1.index))],list(sheet1.index),size=14)#利用excel表中的表格纵轴更新y轴标度

plt.xlim(0,len(sheet1.columns) 1)#设置x轴范围,美化图表

plt.ylim(0,len(sheet1.index) 1)#设置y轴范围,美化图表

plt.legend(handles=[mpatches.Patch(color=colors[i],label=(sheet.index[i])) for i in range(len(sheet.index))]

           ,loc='best',bbox_to_anchor=(1.05,1.0),borderaxespad =0.)

plt.show()#显示图片


“矩阵气泡环图”程序及说明如下:

import numpy as np #导入python的数值计算扩展包numpy,并重命名为np

import matplotlib.pyplot as plt #导入Python的绘图扩展包matplotlib,并重新命名为plt

import pandas as pd #导入python的数据处理扩展包pandas,并重命名为pd,该包用于读写excel文件

import matplotlib.patches as mpatches#导入用于生成图例的库

#plt.style.use('ggplot')#打开或者关闭R语言风格绘图 

 

sheet1=pd.read_excel('散饼数据表.xlsx','工作表1')#从excel的工作表1中读出数据,sheet名称根据实际情况修改

x=[i 1for i in range(len(sheet1.columns))]#获取数据表的列,作为x轴辅助绘图数据

y_index=[i for i inrange(len(sheet1.index))]#获取纵轴有多少行

y = [[i for y_data in range(len(x))] for i in range(1,len(y_index) 1)]#生成y轴辅助数据

 

fig, ax = plt.subplots()#创建子图

colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']#颜色列表

ax.set(aspect='equal')#设置图形的对称,不然饼会椭圆

 

for index in range(len(y_index)):#对转置后的每一列进行循环

   for i,j,r inzip(x,y[index],sheet1.T[sheet1.index[index]]):#循环执行,每次从x,y[index]中读取一个数,从转置后的excel表格中读取一列中的一个数据

       sheet=pd.read_excel('散饼数据表.xlsx',str(sheet1.columns[i-1]) str(sheet1.index[index]))#从excel中的相应sheet中读取数据,根据excel中的工作表名修改

       ifnp.sqrt(r/np.pi)/30 < 0.4:

            ax.pie(sheet['数量'], explode=None, labels=None, colors='w',

     autopct='%d', shadow=False, startangle=90,radius=1/2,center=(i, j),frame=True,textprops={'fontsize':8})#绘制散饼图

           ax.pie(sheet['数量'], explode=None, labels=None, colors=colors,

     autopct=None, shadow=False, startangle=90,radius=r/max(sheet1.max())/2,center=(i,j),frame=True)

       else:

            ax.pie(sheet['数量'], explode=None, labels=None, colors=colors,

     autopct='%d', shadow=False, startangle=90,radius=r/max(sheet1.max())/2,center=(i,j),frame=True,textprops={'fontsize':8})#绘制散饼图,面积大小由radius调节。

       ax.pie([1], radius=r/max(sheet1.max())/2/2,colors='w',center=(i,j),frame=True)#增加甜甜圈的圈,圈大小由radius调节

       ax.text(i,j,str(r),fontsize=8,

                horizontalalignment='center',verticalalignment='center',color='red')#增加数据标签,字体大小由fontsize调节

     

plt.grid(True)#增加栅格  

plt.xlabel('技术手段分类',size=14)#x轴说明

plt.ylabel('技术效果',size=14)#y轴说明

plt.title('XXX领域技术功效分析',size=14)#图片名称

plt.xticks(x,sheet1.columns)#利用excel表中的表格横轴更新x轴标度

plt.yticks([i 1for i inrange(len(sheet1.index))],list(sheet1.index),size=14)#利用excel表中的表格纵轴更新y轴标度

plt.xlim(0,len(sheet1.columns) 1)#设置x轴范围,美化图表

plt.ylim(0,len(sheet1.index) 1)#设置y轴范围,美化图表

plt.legend(handles=[mpatches.Patch(color=colors[i],label=(sheet.index[i])) for i in range(len(sheet.index))]

           ,loc='best',bbox_to_anchor=(1.05,1.0),borderaxespad =0.)#增加图例,并将其移到图框外显示

plt.show()#显示图片


上一篇的留言里,有读者采用R语言绘制了气泡图并分享了程序,很开心能抛砖引玉,欢迎大家一起探讨用不同的方式来实现数据可视化。

相关链接:

作图详解 | 利用Python绘制技术功效图的方法


保护版权人人有责

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多