文章目录
- 专栏导读
- 1. 气泡图介绍
- 1)介绍
- 2)参数说明
- 2. 普通气泡图
- 3. 网格气泡图
- 4. 自定义气泡图颜色
- 5. 不同颜色气泡图
- 6. 钟型气泡图
- 7. 交互气泡图
- 8. 打卡气泡图
- 9. 动态气泡图
专栏导读
🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试,专栏订阅地址:https://blog.csdn.net/yuan2019035055/category_11466020.html
- 优点:订阅限时9.9付费专栏进入千人全栈VIP答疑群,作者优先解答机会(代码指导、远程服务),群里大佬众多可以抱团取暖(大厂内推机会)
- 专栏福利:简历指导、招聘内推、每周送实体书、80G全栈学习视频、300本IT电子书:Python、Java、前端、大数据、数据库、算法、爬虫、数据分析、机器学习、面试题库等等
1. 气泡图介绍
1)介绍
- 气泡图(Bubble Chart)是一种常用的散点图表,用于显示多个数据集之间的相互关系,每一个数据集都用一个圆(气泡)来表示,气泡的大小代表数据之间的比较。它还支持修饰符号以表示特定的分组,但这些修饰符号并不支持大小的排序。
- 气泡图是散点图的改进版本。在散点图中,有两个维度 x 和 y。在气泡图中,存在三个维度 x、y 和 z。其中第三维 z 表示权重。这样,气泡图比二维散点图在视觉上提供了更多信息。
特点:
-
可以有效地同时显示多个变量的关系,显示气泡的数量可以丰富图表的信息量。
-
适用于研究变量间复杂的多元关系的场景,因为它可以同时表示多个变量的关系。
-
可以用来比较单独的数据点之间的关系,наглядно и в короткое время 。
应用场景:
-
适用于展示不同指标之间的关系,在比较多个变量时用它可以更加直观地看出每个变量的大小和它们之间的关系。
-
可以用于衡量政府投资效率,以确定分配资源的最佳方案。
-
也可以用于比较市场上不同公司的产品,用于研究产品的性价比,以及衡量市场上的相关性。
2)参数说明
matplotlib绘制气泡图的函数和散点图一样都是scatter(),以下是函数代码和参数说明大全:
import matplotlib.pyplot as plt
plt.scatter(x,
y,
s=None,
c=None,
marker=None,
cmap=None,
norm=None,
vmin=None,
vmax=None,
alpha=None,
linewidths=None,
edgecolors=None,
plotnonfinite=False,
data=None,
**kwargs
)
参数说明:
x, y:散点图的x和y坐标数据,可以是数组、列表或者Series类型。
s:散点的大小。可以是一个标量,也可以是与x、y等长度相���的数组。
c:散点的颜色。可以是一个表示颜色的字符串,也可以是一个与x、y等长度相同的数组。
marker:散点的形状。可以是一个表示形状的字符串,例如'o'、'+'、'x'等,也可以是一个自定义的MarkerStyle对象。
cmap:颜色映射。如果c参数是一个数组,则可以使用cmap参数指定颜色映射,例如'viridis'、'cool'等。
norm:颜色映射的归一化方式。可以是matplotlib.colors.Normalize对象,也可以是自定义的归一化函数。
vmin, vmax:颜色映射的最小值和最大值。
alpha:散点的透明度。可以是一个标量,也可以是与x、y等长度相同的数组。
linewidths:散点的边框宽度。
edgecolors:散点的边框颜色。
label:散点的标签,用于在图例中显示。
zorder:散点的层级,用于控制散点的绘制顺序。
hatch:散点的填充样式。
picker:指定散点的选中方式,例如'pick_event'表示使用pick事件选中散点。
plotnonfinite:指定是否绘制非有限数据。
data:散点的数据源。
**kwargs:其他可选参数,例如color、size、facecolors等。
以上是scatter()函数的参数说明,可以根据需要灵活使用。
2. 普通气泡图
气泡图是一种散点图,其中每个数据点用一个圆圈表示,并且圆圈的大小表示第三个变量的值。气泡图通常用于显示多个变量之间的关系。我们使用 NumPy 库生成了三个长度为 50 的随机数组 x、y 和 z,其中 z 表示圆圈的大小。然后,我们使用 scatter() 函数绘制气泡图,并将 z 用作圆圈的大小。最后,我们使用 show() 函数显示图像。
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.random.rand(50)
y = np.random.rand(50)
z = np.random.rand(50) * 1000
# 绘制气泡图
plt.scatter(x, y, s=z)
# 显示图像
plt.show()
运行结果:
3. 网格气泡图
网格气泡图是一种在气泡图上添加网格线的可视化方式。它可以帮助读者更清晰地看到数据的趋势和变化,同时也可以帮助读者更准确地读取数据。网格折线图通常用于展示时间序列数据或其他连续变量的趋势。在网格折线图中,横轴通常表示时间或其他连续变量,纵轴表示数据的值。通过添加网格线,可以更清晰地看到数据的变化和趋势,同时也可以更准确地读取数据。
通过设置网格:plt.grid(alph=0.4)
,alph=0.4表示设置透明度,也可以省略不设置
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.random.rand(50)
y = np.random.rand(50)
z = np.random.rand(50) * 1000
# 绘制气泡图
plt.scatter(x, y, s=z)
# 设置网格
plt.grid()
# 显示图像
plt.show()
运行结果:
4. 自定义气泡图颜色
通过设置color=‘’
参数来设置气泡图的颜色:
- red: 红色
- green: 绿色
- blue: 蓝色
- purple: 紫色
- orange: 橙色
- yellow: 黄色
- pink: 粉色
- gray: 灰色
- white: 白色
- black: 黑色
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.random.rand(50)
y = np.random.rand(50)
z = np.random.rand(50) * 1000
# 绘制气泡图,设置为橙色
plt.scatter(x, y, s=z, color='orange')
# 设置网格
plt.grid()
# 显示图像
plt.show()
运行结果:
5. 不同颜色气泡图
通过参数c
和cmap
配合使用,绘制出不同颜色气泡图:
- c:散点的颜色。可以是一个表示颜色的字符串,也可以是一个与x、y等长度相同的数组。
- cmap:颜色映射。如果c参数是一个数组,则可以使用cmap参数指定颜色映射,例如’viridis’、’cool’等。
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
# 防止乱码
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
# 生成随机数据
a = np.random.randn(100)
b = np.random.randn(100)
# 绘制气泡图,colormap:RdYlBu
plt.scatter(a,b,s=np.power(10*a+20*b,2), c=np.random.rand(100), cmap=mpl.cm.RdYlBu,)
# 设置网格
plt.grid()
# 显示图像
plt.show()
运行结果:
6. 钟型气泡图
该代码使用numpy库生成了150个随机的极坐标点,其中极径的范围在[0,2)之间,极角的范围在[0,2pi)之间。点的大小和颜色与极径和极角成正比。然后使用matplotlib库的subplot函数创建了一个极坐标子图,并使用scatter函数绘制了极坐标散点图。其中,cmap参数指定了使用的颜色映射,alpha参数指定了点的透明度。最后调用show函数显示图形。
该代码主要用于展示极坐标散点图的绘制方法,可以用于展示数据的分布情况,如在天文学中展示恒星的位置和亮度。
import numpy as np
import matplotlib.pyplot as plt
# 设定随机数种子,保证每次运行的结果相同
np.random.seed(19680801)
# 生成随机数据
N = 150 # 数据点个数
r = 2 * np.random.rand(N) # 极径,范围在[0,2)之间
theta = 2 * np.pi * np.random.rand(N) # 极角,范围在[0,2pi)之间
area = 200 * r**2 # 点的面积,与极径平方成正比
colors = theta # 颜色,与极角成正比
# 创建画布和子图
fig = plt.figure()
ax = fig.add_subplot(projection='polar')
# 绘制极坐标散点图
c = ax.scatter(theta, r, c=colors, s=area, cmap='hsv', alpha=0.75)
# 显示图形
plt.show()
运行结果:
7. 交互气泡图
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(123)
n = 100
x = np.random.rand(n)
y = np.random.rand(n)
colors = np.random.rand(n)
sizes = np.random.randint(50, 500, n)
# 绘制气泡图
fig, ax = plt.subplots()
scatter = ax.scatter(x, y, c=colors, s=sizes, alpha=0.5)
# 添加颜色条
plt.colorbar(scatter)
# 添加交互功能
annot = ax.annotate("", xy=(0,0), xytext=(20,20),textcoords="offset points",
bbox=dict(boxstyle="round", fc="w"),
arrowprops=dict(arrowstyle="->"))
annot.set_visible(False)
def update_annot(ind):
pos = scatter.get_offsets()[ind["ind"][0]]
annot.xy = pos
text = "{}".format(" ".join(list(map(str,ind["ind"]))))
annot.set_text(text)
def hover(event):
vis = annot.get_visible()
if event.inaxes == ax:
cont, ind = scatter.contains(event)
if cont:
update_annot(ind)
annot.set_visible(True)
fig.canvas.draw_idle()
else:
if vis:
annot.set_visible(False)
fig.canvas.draw_idle()
fig.canvas.mpl_connect("motion_notify_event", hover)
plt.show()
代码说明:
生成随机数据:使用numpy库生成100个随机数作为x和y轴的坐标,另外生成100个随机数作为颜色和大小的参数。
绘制气泡图:使用ax.scatter()函数绘制气泡图,并将颜色和大小参数传递给c和s参数。
添加颜色条:使用plt.colorbar()函数添加颜色条。
添加交互功能:使用ax.annotate()函数添加注释,当鼠标悬停在气泡上时,注释会显示气泡的索引号。使用ax.scatter().contains()函数检查鼠标是否在气泡上,并使用update_annot()函数更新注释内容。最后使用fig.canvas.mpl_connect()函数将hover()函数与figure的motion_notify_event事件连接起来,以实现交互功能。
运行结果:移动鼠标会有交互效果
8. 打卡气泡图
在此示例中,我们使用scatter()方法绘制散点图和add_patch()方法绘制气泡图。同时,我们使用set_xticks()和set_yticks()方法设置坐标轴刻度,使用set_xlim()和set_ylim()方法设置坐标轴范围。
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
# 创建数据
data = {
'Weekday': [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7],
'Hour': [8, 12, 18, 9, 12, 20, 8, 12, 18, 9, 12, 20, 8, 12, 18, 9, 12, 20, 8, 12, 18],
'Count': [5, 7, 8, 4, 6, 9, 6, 7, 8, 5, 6, 7, 3, 4, 5, 4, 5, 7, 2, 3, 5]
}
data = pd.DataFrame(data)
# 创建画布和子图
fig, ax = plt.subplots()
# 绘制散点图
ax.scatter(data['Weekday'], data['Hour'], s=data['Count']*10, alpha=0.5, color='blue')
# 绘制气泡图
for i in range(len(data)):
ax.add_patch(Circle(xy=(data.iloc[i]['Weekday'], data.iloc[i]['Hour']), radius=data.iloc[i]['Count']*0.1, alpha=0.5, color='blue'))
# 设置坐标轴标签和范围
ax.set_xlabel('Weekday')
ax.set_ylabel('Hour')
ax.set_xticks([1, 2, 3, 4, 5, 6, 7])
ax.set_yticks([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])
ax.set_xlim([0.5, 7.5])
ax.set_ylim([-0.5, 23.5])
# 显示图像
plt.show()
代码说明:
创建数据,数据包括星期几、几点钟和打卡次数。
创建画布和子图,使用scatter()方法绘制散点图。
使用add_patch()方法绘制气泡图,其中xy参数表示气泡中心点坐标,radius参数表示气泡半径,alpha参数表示气泡透明度,color参数表示气泡颜色。
设置坐标轴标签和范围,使用set_xticks()和set_yticks()方法设置坐标轴刻度,使用set_xlim()和set_ylim()方法设置坐标轴范围。
显示图像。
运行结果:
9. 动态气泡图
数据集其中包含每个国家/地区不同时间的收入和预期生命周期:https://download.csdn.net/download/yuan2019035055/87720146
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.animation import FuncAnimation
# 读取数据
gapminder_df = pd.read_csv(r'C:\Users\data.csv')
# 初始化图像
fig, ax = plt.subplots(figsize = (12, 7))
# 定义更新函数
def animate(i):
ax.cla() # 清除当前图形
year = 1800 + i # 计算当前年份
# 绘制气泡图
sns.scatterplot(x = 'Income', # x轴数据
y = 'Life Expectancy', # y轴数据
size = 'Population', # 气泡大小
data = gapminder_df[gapminder_df['Year'] == year], # 数据集
hue = 'Region', # 按区域着色
ax = ax, # 指定子图
alpha = 0.7, # 设置透明度
sizes = (50, 3000)) # 设置气泡大小范围
ax.set_title(f'Year {year}') # 设置标题
ax.set_xscale('log') # 设置x轴为对数坐标轴
ax.set_ylim(25, 90) # 设置y轴范围
ax.set_xlim(100, 100000) # 设置x轴范围
handles, labels = ax.get_legend_handles_labels() # 获取图例句柄和标签
ax.legend(handles[:5], labels[:5], loc = 'upper left') # 设置图例
# 创建动画对象
ani = FuncAnimation(fig = fig, func = animate, frames = 220, interval = 100)
# 显示动画
plt.show()
解释说明:
导入必要的库,包括pandas、matplotlib.pyplot、seaborn和matplotlib.animation。
读取数据,使用pandas的read_csv()函数读取数据文件。
初始化图像,创建一个子图,指定图像大小。
定义更新函数,接收一个参数i,表示当前帧数。在每一帧中,清除当前图形,计算当前年份,绘制气泡图,设置标题、坐标轴和图例。
创建动画对象,使用FuncAnimation()函数创建一个动画对象,指定更新函数、帧数和帧间隔。
显示动画,使用show()函数显示动画。
运行结果:
文章出处登录后可见!