Python绘制气泡图(附带实例)
气泡图(Bubble Chart)是一种用于可视化 3 个变量之间关系的图表类型。气泡图基本上类似于一个散点图,它通过在坐标系中以点的形式表示数据,并使用不同大小的气泡(圆形)来表示第 3 个变量的数值。
气泡图能够同时展示 3 个变量之间的关系,通过点的位置和气泡的大小可以观察两个变量之间的相关性和趋势,并展示第 3 个变量的相对大小。
注意,绘图时需要考虑气泡的大小范围,确保气泡大小的差异在图表中明显可见。可以根据数据的范围和分布进行适当的调整。如果数据集中有多个类别或分组,可以考虑使用不同的颜色或形状来区分和表示不同的类别,以增加图表的多样性和可读性。
【实例 1】基于 gapminder 数据集绘制基础气泡图,展示人均 GDP(GDP per Capita)与预期寿命(Life Expectancy)之间的关系,并且根据大洲(Continent)对数据进行分类。输入如下代码:
输出的结果如下图所示:

图 1 基础气泡图1
【实例 2】基于 gapminderData 数据集绘制气泡图,展示人均 GDP 与预期寿命之间的关系。输入如下代码:

图 2 基础气泡图2
【实例 3】基于 midwest_filter 数据集绘制带边界的气泡图。从应该环绕的数据框中获取记录,并用 encircle() 来使边界显示出来。输入如下代码:

图 3 带边界的气泡图
【实例 4】绘制极坐标下的气泡图。输入如下代码:

图 4 极坐标下的气泡图
气泡图能够同时展示 3 个变量之间的关系,通过点的位置和气泡的大小可以观察两个变量之间的相关性和趋势,并展示第 3 个变量的相对大小。
注意,绘图时需要考虑气泡的大小范围,确保气泡大小的差异在图表中明显可见。可以根据数据的范围和分布进行适当的调整。如果数据集中有多个类别或分组,可以考虑使用不同的颜色或形状来区分和表示不同的类别,以增加图表的多样性和可读性。
【实例 1】基于 gapminder 数据集绘制基础气泡图,展示人均 GDP(GDP per Capita)与预期寿命(Life Expectancy)之间的关系,并且根据大洲(Continent)对数据进行分类。输入如下代码:
import matplotlib.pyplot as plt # 导入 Matplotlib 库并简写为 plt import seaborn as sns # 导入 Seaborn 库并简写为 sns from gapminder import gapminder # 导入数据集 plt.rcParams['figure.figsize']=[8,8] # 设置笔记本中的图形大小 data=gapminder.loc[gapminder.year==2007] # 从数据集中选择特定年份的数据 # 使用 scatterplot() 函数绘制气泡地图 sns.scatterplot(data=data,x="gdpPercap",y="lifeExp",size="pop", legend=False,sizes=(20,1600)) plt.show() sns.set_style("darkgrid") # 设置 Seaborn 主题为 "darkgrid" # 使用 scatterplot() 函数绘制气泡地图 sns.scatterplot(data=data,x="gdpPercap",y="lifeExp",size="pop", hue="continent",palette="viridis", edgecolor="blue",alpha=0.5,sizes=(10,1600)) # 添加标题(主标题和轴标题) plt.xlabel("Gdp per Capita") # X 轴标题 plt.ylabel("Life Expectancy") # Y 轴标题 # 将图例放置在图形外部 plt.legend(bbox_to_anchor=(1,1),loc='upper left',fontsize=15) plt.show()上述代码使用 Seaborn 库和 Matplotlib 库来绘制气泡地图。首先,使用 Seaborn 的 scatterplot() 函数绘制了一个简单的气泡地图,其中 X 轴表示人均 GDP,Y 轴表示预期寿命,气泡的大小表示人口数量。然后,通过调整 Seaborn 的样式和色彩,再次使用 scatterplot() 函数绘制了一个带有大陆分组和定制化样式的气泡地图。
输出的结果如下图所示:

图 1 基础气泡图1
【实例 2】基于 gapminderData 数据集绘制气泡图,展示人均 GDP 与预期寿命之间的关系。输入如下代码:
import pandas as pd # 导入 Pandas 库并简写为 pd import matplotlib.pyplot as plt # 导入 Matplotlib 库并简写为 plt data=pd.read_csv('D:/DingJB/PyData/gapminderData.csv') # 读取数据 data.head(2) # 检查前两行数据 # 将分类列(continent)转换为数值型分组(group1->1,group2->2...) data['continent'=pd.Categorical(data['continent']) plt.figure(figsize=(8,6)) # 设置图形大小 data1952=data[data.year==1952] # 选取 1952 年的数据子集 # 绘制散点图 plt.scatter( x=data1952['lifeExp'], # X 轴为预期寿命 y=data1952['gdpPercap'], # Y 轴为人均 GDP s=data1952['pop']*50000, # 气泡大小与人口数量相关 c=data1952['continent'].cat.codes, # 根据大洲分类编码设置气泡颜色 cmap="Accent", # 使用 Accent 调色板 alpha=0.6, # 设置透明度 edgecolors="white", # 设置气泡边缘颜色 linewidth=2) # 设置气泡边缘线宽度 # 添加标题(主标题和轴标题) plt.yscale('log') # 设置 Y 轴为对数尺度 plt.xlabel("Life Expectancy") # X 轴标题 plt.ylabel("GDP per Capita") # Y 轴标题 plt.title("Year 1952") # 主标题 plt.ylim(0,50000) # 设置 Y 轴范围 plt.xlim(30,75) # 设置 X 轴范围上述代码从 CSV 文件中读取数据,并绘制了 1952 年各国的人均 GDP 与预期寿命的散点图。气泡的大小代表人口数量,颜色代表所属大洲。通过设置对数尺度的Y轴,使数据更易于观察。输出的结果如下图所示。

图 2 基础气泡图2
【实例 3】基于 midwest_filter 数据集绘制带边界的气泡图。从应该环绕的数据框中获取记录,并用 encircle() 来使边界显示出来。输入如下代码:
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.spatial import ConvexHull # 步骤 1:准备数据 midwest=pd.read_csv("D:/DingJB/PyData/midwest_filter.csv") # 导入数据 # 每个唯一 midwest['category'] 对应一个颜色 categories=np.unique(midwest['category']) colors=plt.cm.tab10(i/float(len(categories)-1) for i in range(len(categories))) # 步骤 2:绘制散点图,每个类别使用唯一颜色 fig=plt.figure(figsize=(10,6),dpi=80,facecolor='w', edgecolor='k') # 创建图形 for i,category in enumerate(categories): plt.scatter('area','poptotal', data=midwest.loc[midwest.category==category:i],s='dot_size', c=colors[i],label=str(category),edgecolors='black', linewidths=.5,alpha=0.5) # 绘制气泡图 # 步骤 3:绘制围绕数据点的多边形 def encircle(x,y,ax=None,**kw): if not ax:ax=plt.gca() p=np.c_[x,y] hull=ConvexHull(p) poly=plt.Polygon(p[0].vertices,**kw) ax.add_patch(poly) # 选择要绘制图的数据 midwest_encircle_data=midwest.loc[midwest.state=='IN',:] # 绘制围绕数据点的多边形 encircle(midwest_encircle_data.area,midwest_encircle_data.poptotal, ec="k",fc="gold",alpha=0.1) encircle(midwest_encircle_data.area,midwest_encircle_data.poptotal, ec="firebrick",fc="none",linewidth=1.5) # 步骤 4:修饰图形 plt.gca().set_xlim(0.0,0.1),ylim=(0,90000) # 设置坐标轴的范围和标签 xlabel='Area',ylabel='Population' # 设置标题 plt.xticks(fontsize=12); plt.yticks(fontsize=12) # 设置刻度的字体大小 plt.title("Scatterplot of Midwest Area vs Population", fontsize=18) # 设置标题 plt.legend(fontsize=12) # 显示图例 plt.show()上述代码展示了如何绘制气泡图,其中每个类别使用唯一的颜色,然后围绕选定数据点绘制了多边形。通过准备数据、绘制气泡图和多边形以及修饰图形,完整地展示了如何创建此类可视化图形。输出的结果如下图所示:

图 3 带边界的气泡图
【实例 4】绘制极坐标下的气泡图。输入如下代码:
import matplotlib.pyplot as plt import numpy as np np.random.seed(19781101) # 固定随机数种子,以使结果可复现 N=150 r=2*np.random.rand(N) theta=2*np.pi*np.random.rand(N) area=200*r**2 colors=theta # 创建第 1 个图形 fig=plt.figure() ax=fig.add_subplot(projection='polar') c=ax.scatter(theta,r,c=colors,s=area,cmap='hsv',alpha=0.75) # 创建第 2 个图形 fig=plt.figure() ax=fig.add_subplot(projection='polar') c=ax.scatter(theta,r,c=colors,s=area,cmap='hsv',alpha=0.75) # 设置极坐标原点的位置 ax.set_rorigin(-2.5) ax.set_theta_zero_location('W',offset=10) plt.show() # 显示第 1 个图形 # 创建第 3 个图形 fig=plt.figure() ax=fig.add_subplot(projection='polar') c=ax.scatter(theta,r,c=colors,s=area,cmap='hsv',alpha=0.75) # 设置极坐标角度的范围 ax.set_thetamin(45) ax.set_thetamax(135)上述代码利用 Matplotlib 创建了极坐标散点图,通过调整参数实现了对极坐标原点位置、角度零点位置和角度范围的定制,展示了数据点在极坐标系下的分布和特征。输出的结果如下图所示:

图 4 极坐标下的气泡图