python—matplotlib 散点图,气泡图,气泡饼图/功效矩阵可视化对比
刚入行,一直在看大神们的发帖学习,想着自己也写点什么东西,找了好久没找到气泡饼图相关的内容(可能是我眼神不好),于是打算写个matplotlib绘制散点图,气泡图和气泡饼图对比。仅供娱乐。
散点图,气泡图相信大多数都了解,都是基础图表,而气泡饼图则是在气泡图的基础上增加一个维度,用饼图代替气泡的显示,简单来说散点图是一维图表,气泡图是二维图表,气泡饼图是三维图表。个人认为任务的难点在于数据的处理,而效果在于可视化展示,接下来一步步介绍具体内容。
首先是图表类型,不难看出其涉及到的主要是:
饼图参数:matplotlib.pyplot.?pie
(
x,?explode=None?,?labels=None?,?colors=None?,?autopct=None?,pctdistance=0.6,shadow=False,labeldistance=1.1,?startangle=None?,?radius?=None?,?counterclock=True?,wedgeprops=None,textprops=None,?center(0,0),?frame=False,?rotatelabels=False,?hold=None,?dataNone
)
散点图参数:matplotlib.?pyplot.scatter
(
x,y,s=None?,C=None,?marker=None?,?cmap=None,norm=Nonevmin=None,vsax=None?,alpha=Norne,linewidths=None,verts=None,edgecolors=None,data-None, **kwargs
)
这里就不过多解释了,好多大神那里都有详尽的讲解。
示例:相同数据源下绘制散点图,气泡图,气泡饼图
数据表:由真实数据更改公开号和发明人名字所得。列举了前19条。
公开(公告)号 | 第一发明人 | 申请年 | 法律状态 | a1 | 张三 | 2010 | 有效 | a2 | 张三 | 2010 | 有效 | a3 | 李四 | 2010 | 有效 | a4 | 李四 | 2010 | 有效 | a5 | 张三 | 2011 | 有效 | a6 | 张三 | 2011 | 有效 | a7 | 张三 | 2011 | 有效 | a8 | 张三 | 2011 | 有效 | a9 | 王五 | 2011 | 有效 | a10 | 王五 | 2011 | 有效 | a11 | 王五 | 2011 | 失效 | a12 | 张三 | 2012 | 有效 | a13 | 张三 | 2012 | 有效 | a14 | 张三 | 2012 | 有效 | a15 | 张三 | 2012 | 有效 | a16 | 张三 | 2012 | 有效 | a17 | 王五 | 2012 | 有效 | a18 | 王五 | 2012 | 有效 | a19 | 王五 | 2012 | 有效 | a20 | 王五 | 2012 | 有效 |
第三方模块:
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
from pylab import mpl
一.散点图。
源代码展示:
df = pd.read_excel(r'E:\软件下载\气泡饼图数据.xlsx')
df1 = df[['第一发明人', '申请年', '公开(公告)号']] #提取字段,在原数据字段过多时使用
df1 = df1.groupby(['申请年', '第一发明人'], as_index=False).count() # 分组计数
df1 = df1.sort_values(by='公开(公告)号', ascending=False) # 排序
df1.columns = ['申请年', '第一发明人', '申请数量'] #更改字段名,主要是更改用于排序的字段名
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.2) #设置画布尺寸
color = np.random.rand(len(df1['申请数量'])) #按照dataframe数量随机生成颜色列表
plt.scatter(df1['申请年'], df1['申请数量'],s=20) #X轴,Y轴数据,标记点的尺寸
plt.xlabel('申请年份') #X轴名称
plt.ylabel('申请数量') #Y轴名称
plt.xticks(df1['申请年'], df1['申请年'],rotation=15) #X轴刻度与标签配置
plt.show() #展示图表
可视化展示:
?二.气泡图。
源代码展示:
df = pd.read_excel(r'E:\软件下载\气泡饼图数据.xlsx')
df1 = df[['第一发明人', '申请年', '公开(公告)号']]
df1 = df1.groupby(['申请年', '第一发明人'], as_index=False).count()
df1 = df1.sort_values(by='公开(公告)号', ascending=False)
df1.columns = ['申请年', '第一发明人', '申请数量']
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.15)
color = np.random.rand(len(df1['申请数量']))
plt.scatter(df1['申请年'], df1['第一发明人'], df1['申请数量']*20)
# df1['申请数量']*20 为尺寸列表,控制气泡的大小,*20是为了突出显示,无实际意义。其他与饼图一致不多赘述。
plt.xlabel('申请年份')
plt.ylabel('第一发明人')
plt.xticks(df1['申请年'], df1['申请年'],rotation=15)
plt.show()
可视化展示:
?
?三.气泡饼图。
源代码展示:
df = pd.read_excel(r'E:\软件下载\气泡饼图数据.xlsx')
# x轴 Y轴 饼图分类 计数 字段
df1= df[['申请年','第一发明人','法律状态','公开(公告)号']]
#获取 三个维度的字段列表 以便绘图使用
dfs=df1.groupby('申请年',as_index=False)['公开(公告)号'].count()
dfz=df1.groupby('法律状态',as_index=False)['公开(公告)号'].count()
dfj=df1.groupby('第一发明人',as_index=False)['公开(公告)号'].count()
listz=list(dfz['法律状态'])
lists=list(dfs['申请年'])
listj=list(dfj['第一发明人'])
# x轴 Y轴
df1=df1.groupby(['申请年','第一发明人'],as_index=False)['公开(公告)号'].count()
df1=df1.sort_values(by='申请年',ascending=True)
df2= df1.pivot_table(columns='申请年',index='第一发明人', values='公开(公告)号', aggfunc=np.sum, fill_value=0) #数据透视
df_1=df[['申请年','第一发明人','法律状态','公开(公告)号']]
df_1=df_1.groupby(['申请年','第一发明人','法律状态'],as_index=False)['公开(公告)号'].count()
df_2= df_1.pivot_table(index=['第一发明人','申请年'], values='公开(公告)号', columns='法律状态', aggfunc=np.sum, fill_value=0) #数据透视
with pd.ExcelWriter(r"E:\软件下载\功效矩阵过渡.xlsx")as writer:
df2.to_excel(writer, sheet_name='工作表1')
df_2.to_excel(writer,sheet_name='工作表2')
# 将处理好的数据写入execl表,方便查看
df2 = pd.read_excel(r'E:\软件下载\功效矩阵过渡.xlsx','工作表1')
df_2 = pd.read_excel(r'E:\软件下载\功效矩阵过渡.xlsx','工作表2')
df_2=df_2.fillna(method='ffill') #对数据透视表填充空值,用前一个值填充。
df_3=df_2.iloc[:,2:] # 切片获取第二列到最后一列的数据
df_3=df_3.T # 数组转置
m=0
df2=df2.iloc[:,1:]
x = [i+1 for i in range(len(df2.columns))] # 获取数据表的列,作为x轴辅助绘图数据
y_index = [i for i in range(len(df2.index))] # 获取纵轴有多少行
y = [[i for y_data in range(len(x))] for i in range(1, len(y_index)+1)] # 生成y轴辅助数据
# 与df_3 形成对应关系
fig, ax = plt.subplots() # 创建子图
colors = ['#FABB27', '#43B74B','#1976D2', '#CDCE12'] # 颜色列表
ax.set(aspect='equal') # 设置图形的对称,不然饼会椭圆
##饼图显示数值 数据过于杂乱,如有需要自行配置。
# def absolute_value(val):
# a = np.round(val/100.*lt.sum(), 0)
# return a
for index in range(len(y_index)): # 对转置后的每一列进行循环 #每次找一列数据 某人 某年 各法律状态 画饼图
print('index=',index)
for i, j, r in zip(x, y[index], df2.T[df2.index[index]]): # 循环执行,每次从x,y[index]中读取一个数,从转置后的excel表格中读取一列中的一个数据
if r != 0 :
lt = df_3[m] #每次取一列 绘制饼图
lt.columns = ['数量']
ax.pie(lt, colors=colors,startangle=90, radius=r / max(df2.max()) / 2, center=(i, j), frame=True)
#radius控制大小 饼图半径 取最值除以2 以避免饼图重叠, center控制位置中心点坐标
m = m + 1
plt.grid( ls = '-.',lw = 0.35) # 增加栅格
plt.xlabel('申请年', size=14) # x轴说明
plt.ylabel('第一发明人', size=14) # y轴说明
# plt.title('气泡饼图', size=14) # 图片名称
plt.subplots_adjust(left=0.1,right=0.9,top=0.9,bottom=0.15)
plt.xticks(x, lists,rotation=15) # 更新x轴标度
plt.yticks([i+1 for i in range(len(df2.index))], listj) # 更新y轴标度
plt.xlim(0, len(df2.columns)+1) # 设置x轴范围,美化图表
plt.ylim(0, len(df2.index)+1) # 设置y轴范围,美化图表
plt.legend(handles=[mpatches.Patch(color=colors[i], label=(lt.index[i])) for i in range(len(lt.index))]
, loc='upper left',bbox_to_anchor=(1,1))#配置图例
plt.show() # 显示图片
过渡表格数据:
第一发明人 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 吴十 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 8 | 5 | 2 | 2 | 4 | 周九 | 0 | 0 | 0 | 1 | 5 | 1 | 4 | 1 | 1 | 1 | 0 | 0 | 孙八 | 0 | 0 | 0 | 2 | 3 | 1 | 2 | 1 | 5 | 8 | 4 | 2 | 张三 | 2 | 4 | 5 | 10 | 21 | 11 | 21 | 12 | 20 | 17 | 11 | 3 | 李四 | 2 | 0 | 0 | 1 | 1 | 2 | 3 | 2 | 10 | 2 | 0 | 2 | 样二 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 6 | 1 | 2 | 1 | 0 | 王五 | 0 | 3 | 9 | 10 | 4 | 6 | 4 | 4 | 4 | 3 | 2 | 0 | 赵六 | 0 | 0 | 1 | 0 | 4 | 5 | 3 | 3 | 5 | 2 | 5 | 1 | 郑一 | 0 | 0 | 0 | 0 | 0 | 0 | 9 | 3 | 1 | 1 | 3 | 0 | 钱七 | 0 | 0 | 1 | 3 | 2 | 1 | 1 | 1 | 0 | 1 | 1 | 2 |
第一发明人 | 申请年 | 失效 | 审中 | 有效 | 吴十 | 2016 | 0 | 0 | 1 | 2017 | 4 | 0 | 4 | 2018 | 2 | 0 | 3 | 2019 | 0 | 1 | 1 | 2020 | 0 | 1 | 1 | 2021 | 0 | 4 | 0 | 周九 | 2013 | 0 | 0 | 1 | 2014 | 0 | 0 | 5 | 2015 | 0 | 0 | 1 | 2016 | 0 | 0 | 4 | 2017 | 0 | 0 | 1 | 2018 | 0 | 0 | 1 | 2019 | 0 | 0 | 1 | 孙八 | 2013 | 0 | 0 | 2 | 2014 | 0 | 0 | 3 | 2015 | 0 | 0 | 1 | 2016 | 0 | 0 | 2 | 2017 | 0 | 0 | 1 | 2018 | 0 | 0 | 5 | 2019 | 0 | 4 | 4 | 2020 | 0 | 2 | 2 | 2021 | 0 | 2 | 0 |
可视化展示:
?以上便是本篇全部内容。
|