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

气泡图(Bubble plot)简介

python能做气泡按钮吗_数据可视化

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

快速绘制

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

python能做气泡按钮吗_python_02

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

python能做气泡按钮吗_python_03

定制多样化的气泡图

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

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

python能做气泡按钮吗_python能做气泡按钮吗_04

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

python能做气泡按钮吗_数据可视化_05

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

python能做气泡按钮吗_python_06

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

python能做气泡按钮吗_python_07

总结

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

共勉~