首页 > 编程笔记 > Python笔记 阅读:14

Python绘制气泡图(附带实例)

气泡图(Bubble Chart)是一种用于可视化 3 个变量之间关系的图表类型。气泡图基本上类似于一个散点图,它通过在坐标系中以点的形式表示数据,并使用不同大小的气泡(圆形)来表示第 3 个变量的数值。

气泡图能够同时展示 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 极坐标下的气泡图

相关文章