前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关系(四)利用python绘制气泡图

关系(四)利用python绘制气泡图

作者头像
HsuHeinrich
发布2024-04-18 18:26:35
3550
发布2024-04-18 18:26:35
举报
文章被收录于专栏:HsuHeinrich

关系(四)利用python绘制气泡图

气泡图(Bubble plot)简介

气泡图是散点图的变种,可以利用圆的大小来可视化第三个变量。

快速绘制

基于seaborn

代码语言:javascript
复制
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

代码语言:javascript
复制
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[1]了解更多用法

代码语言:javascript
复制
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[2]了解更多用法

自定义气泡图

代码语言:javascript
复制
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绘制动态气泡图

代码语言:javascript
复制
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绘制动态气泡图

点击下面的播放按钮即可

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HsuHeinrich 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关系(四)利用python绘制气泡图
    • 气泡图(Bubble plot)简介
      • 快速绘制
        • 定制多样化的气泡图
          • 通过seaborn绘制多样化的气泡图
          • 通过seaborn绘制多样化的气泡图
        • 总结
          • 参考资料
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档