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

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

气泡图(Bubble plot)简介

1

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

快速绘制

  1. 基于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()
    

    2

  2. 基于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()
    

    3

定制多样化的气泡图

自定义气泡图一般是结合使用场景对相关参数进行修改,并辅以其他的绘图知识。参数信息可以通过官网进行查看,其他的绘图知识则更多来源于实战经验,大家不妨将接下来的绘图作为一种学习经验,以便于日后总结。

通过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()

4

通过seaborn绘制多样化的气泡图

matplotlib主要利用scatter绘制气泡图,可以通过matplotlib.pyplot.scatter了解更多用法

  1. 自定义气泡图

    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()
    

    5

  2. 合成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')
    

    6

  3. 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())
    

    7

总结

以上通过seaborn的scatterplot和matplotlib的scatter快速绘制气泡图,并通过修改参数或者辅以其他绘图知识自定义各种各样的气泡图来适应相关使用场景。

共勉~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值