关系(四)利用python绘制气泡图
气泡图(Bubble plot)简介
气泡图是散点图的变种,可以利用圆的大小来可视化第三个变量。
快速绘制
-
基于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绘制多样化的气泡图
seaborn主要利用scatterplot
绘制气泡图,可以通过seaborn.scatterplot了解更多用法
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()
通过seaborn绘制多样化的气泡图
matplotlib主要利用scatter
绘制气泡图,可以通过matplotlib.pyplot.scatter了解更多用法
-
自定义气泡图
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
快速绘制气泡图,并通过修改参数或者辅以其他绘图知识自定义各种各样的气泡图来适应相关使用场景。
共勉~