上一篇我们利用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语言绘制了气泡图并分享了程序,很开心能抛砖引玉,欢迎大家一起探讨用不同的方式来实现数据可视化。 相关链接: 保护版权人人有责 |
|