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() #展示图表

可视化展示:

python matplotlib 地图气泡 python画气泡图_矩阵

 二.气泡图。

源代码展示:

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()

可视化展示:

python matplotlib 地图气泡 python画气泡图_矩阵_02

 

 三.气泡饼图。

源代码展示:

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

可视化展示:

python matplotlib 地图气泡 python画气泡图_数据_03

 以上便是本篇全部内容。