气泡图是散点图的变种,可以利用圆的大小来可视化第三个变量。
基于seaborn
import matplotlib.pyplot as plt
import seaborn as sns
from gapminder import gapminder
# 导入数据
data = gapminder.loc[gapminder.year == 2007]
# 利用scatterplot函数快速绘制气泡图
sns.scatterplot(data=data, x="gdpPercap", y="lifeExp", size="pop")
plt.show()
基于matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
from gapminder import gapminder
# 导入数据
data = gapminder.loc[gapminder.year == 2007]
# 利用scatter函数快速绘制气泡图
# matplotlib的s为点的面积,不宜过大。对人口变量进行缩放处理
bubble_size = data['pop'] / max(data['pop']) * 1000
plt.scatter(data["gdpPercap"], data["lifeExp"], s=bubble_size, alpha=0.5)
plt.show()
自定义气泡图一般是结合使用场景对相关参数进行修改,并辅以其他的绘图知识。参数信息可以通过官网进行查看,其他的绘图知识则更多来源于实战经验,大家不妨将接下来的绘图作为一种学习经验,以便于日后总结。
seaborn主要利用scatterplot
绘制气泡图,可以通过seaborn.scatterplot[1]了解更多用法
import matplotlib.pyplot as plt
import seaborn as sns
from gapminder import gapminder
# 导入数据
data = gapminder.loc[gapminder.year == 2007]
# 利用scatterplot函数快速绘制气泡图
sns.scatterplot(data=data, x="gdpPercap", y="lifeExp", size="pop",
hue="continent", # 颜色分组,可以展示第四个变量
palette="viridis", # 采用调色板分配颜色
edgecolors="black", # 设置边缘色
legend=True, # 图例设置
sizes=(20, 400), # 控制大小的范围,自动缩放
)
plt.show()
matplotlib主要利用scatter
绘制气泡图,可以通过matplotlib.pyplot.scatter[2]了解更多用法
自定义气泡图
import matplotlib.pyplot as plt
import numpy as np
# 自定义数据
x = np.random.rand(15)
y = x+np.random.rand(15)
z = x+np.random.rand(15)
z=z*z
# 将颜色映射到x变量
plt.scatter(x, y, s=z*2000, c=x, cmap="Blues", alpha=0.4, edgecolors="grey", linewidth=2)
plt.show()
合成gif绘制动态气泡图
import matplotlib.pyplot as plt
import pandas as pd
import imageio
import os
from IPython.display import Image
from gapminder import gapminder
# 导入数据
data = gapminder.copy()
# 数据预处理
data['continent']=pd.Categorical(data['continent'])
# 设置分辨率
dpi=96
# 生成文件夹
if not os.path.exists('Animated_Bubble_Chart'):
os.makedirs('Animated_Bubble_Chart')
# 遍历年份
for i in data.year.unique():
# 关闭交互式绘图
plt.ioff()
# 初始化布局
fig = plt.figure(figsize=(680/dpi, 480/dpi), dpi=dpi)
# 筛选数据
subsetData = data[ data.year == i ]
# 散点图
plt.scatter(
x=subsetData['lifeExp'],
y=subsetData['gdpPercap'],
s=subsetData['pop']/200000 ,
c=subsetData['continent'].cat.codes,
cmap="Accent", alpha=0.6, edgecolors="white", linewidth=2)
# 添加标题信息
plt.yscale('log')
plt.xlabel("Life Expectancy")
plt.ylabel("GDP per Capita")
plt.title("Year: "+str(i) )
plt.ylim(1,100000)
plt.xlim(30, 90)
# 存储图片
filename='Animated_Bubble_Chart/'+str(i)+'.png'
plt.savefig(fname=filename, dpi=96)
plt.gca()
plt.close(fig)
# 合成gif并展示
# 存放图像的路径
image_folder = "Animated_Bubble_Chart/"
# 读取图片
image_files = os.listdir(image_folder)
images = []
for image_file in image_files:
if image_file.endswith('.png'):
images.append(imageio.imread(image_folder + image_file))
# 写入GIF文件
imageio.mimsave('Animated_Bubble_Chart/Animated_Bubble_Chart.gif', images, duration=0.5) # 自定义秒数
# 展示GIF文件
Image(url='Animated_Bubble_Chart/Animated_Bubble_Chart.gif')
animation绘制动态气泡图
点击下面的播放按钮即可
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
import seaborn as sns
from IPython.display import HTML
from sklearn import preprocessing
from gapminder import gapminder
# 导入数据
data = gapminder.copy()
# 数据预处理
# 缩放population数据
data["scaled_pop"] = data["pop"] / 200000
# 分配 continent 列的数字编码
data['continent_code']=pd.Categorical(data['continent']).codes
# 年份列表
years = data["year"].unique()
# 初始化布局
fig, ax = plt.subplots()
# 设置轴的范围
ax.set_yscale('log')
ax.set_xlim(30, 90)
ax.set_ylim(1,100000)
ax.set_xlabel("Life Expectancy")
ax.set_ylabel("GDP per Capita")
# 初始化散点图对象,开始时无数据
scatter = plt.scatter([], [], c=[], cmap="Accent", alpha=0.6, edgecolors="white")
def animate(i):
current_year = years[i] # 获取当前年份
df_year = data[data["year"] == current_year] # 获取对应年份的数据子集
scatter.set_offsets(np.c_[df_year["lifeExp"], df_year["gdpPercap"]]) # 更新x和y数据
scatter.set_sizes(df_year["scaled_pop"]) # 更新点的大小
scatter.set_array(df_year["continent_code"]) # 更新点的颜色
ax.set_title("Year: " + str(current_year)) # 更新标题
ani = animation.FuncAnimation(
fig,
animate,
frames=len(years),
interval=500, # 0.5秒
repeat=True)
plt.close()
HTML(ani.to_jshtml())
以上通过seaborn的scatterplot
和matplotlib的scatter
快速绘制气泡图,并通过修改参数或者辅以其他绘图知识自定义各种各样的气泡图来适应相关使用场景。
共勉~
[1]
seaborn.scatterplot: https://seaborn.pydata.org/generated/seaborn.scatterplot.html
[2]
matplotlib.pyplot.scatter: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html