目录
气泡图简介:
一、导入库
二、准备数据
三、画气泡图--基础版
四、画气泡图--进阶版一 (控制气泡大小)
解读气泡图:
五、画气泡图--进阶版二(控制气泡颜色)
(一)用参数c控制气泡颜色
(二)用for循环的方法控制气泡颜色
(三)给气泡分配指定的颜色(调整气泡颜色分配)
六、添加图例
(一)图例的一些基本设置--参数讲解
(二) 图例的排列方式--横向排放
(三)调整图例可视化图形大小及透明度
(四)给图例添加标题
(五) 将图例设置到图像外侧
再次解读气泡图:
七、完整代码
气泡图简介:
气泡图(Bubble Chart)是一种数据可视化图形,它主要用于展示多个数据点之间的关系。气泡图通过大小不同的气泡来表示数据点的值,气泡的位置和颜色也可以传递额外的信息。在气泡图中,横轴和纵轴通常表示数据的两个维度,而气泡的半径和位置则表示数据的值。气泡图常用于分析多元数据,特别是在需要考虑多个变量之间关系的情况下。 简单来说,气泡图是一种能够在二维平面上展示多元数据关系的图表,通过气泡的大小、位置和颜色来表示数据点的值和属性。
在气泡图中,气泡的面积大小(半径大小)通常代表数据的某个属性值,如数值、数量等,面积越大,对应的属性值越大。
气泡的颜色通常代表另一个属性,如分类、状态等,不同的颜色可以区分不同的类别或状态。
例如,在反映各国GDP等情况的气泡图中,气泡面积可以代表GDP大小,颜色可以代表国家类别。
下面利用实例来探究气泡图的具体应用,使用的使python
一、导入库
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import seaborn as sns
二、准备数据
iris = load_iris()
# 这里,`load_iris()`函数从sklearn库中加载鸢尾花数据集
X = iris.data
Y = iris.target
# 并将数据和目标变量分别存储在X和Y中。
# X表示花瓣长度、花瓣宽度、花萼长度和花萼宽度等特征,Y表示三个品种(setosa,versicolor,virginica)的标签。
# 将X和Y转换为DataFrame
data = pd.DataFrame(X, columns=iris.feature_names)
data['target'] = Y
这里,`load_iris()`函数从sklearn库中加载鸢尾花数据集
并将数据和目标变量分别存储在X和Y中。
X表示花瓣长度、花瓣宽度、花萼长度和花萼宽度等特征,Y表示三个品种(setosa,versicolor,virginica)的标签。
将X和Y转换为DataFrame形式
数据data表结果如下:
三、画气泡图--基础版
plt.figure(figsize=(15,10))#图形长、宽
plt.rcParams['font.sans-serif'] = ['SimHei']# 中文显示
size =list(data["petal length (cm)"].astype(float))
# size =list(data["petal length (cm)"].astype(float)/0.002)
plt.scatter(data["sepal length (cm)"].astype(float),
data["sepal width (cm)"].astype(float),
s=size,
alpha=0.6) # 画散点图, alpha=0.6 表示不透明度为 0.6
plt.xlabel('sepal length (cm)',fontsize=20) # 横坐标轴标题
plt.gca().xaxis.set_label_coords(0.5, -0.1) # 调整X轴标题与X轴的距离
plt.ylabel('sepal width (cm)',fontsize=20) # 纵坐标轴标题
plt.gca().yaxis.set_label_coords(-0.08, 0.5) # 调整y轴标题与y轴的距离
plt.title("气泡图",fontsize=30,pad=15)
plt.tick_params(labelsize=20) #刻度字体大小20
plt.show()
一些比较基础的设置,在上面代码直接标上注释啦!
下面直接介绍一下核心部分:
size =list(data["petal length (cm)"].astype(float))
plt.scatter(data["sepal length (cm)"].astype(float),
data["sepal width (cm)"].astype(float),
s=size,
alpha=0.6)
① data["sepal length (cm)"].astype(float)
:
从数据集中提取名为"sepal length (cm)"的列,并将其转换为浮点数类型。
将这一列数据作为x轴横坐标数据
②data["sepal width (cm)"].astype(float)
:
从数据集中提取名为"sepal width (cm)"的列,并将其转换为浮点数类型。
将这一列数据作为y轴纵坐标数据
③size =list(data["petal length (cm)"].astype(float)):
从数据集中提取名为"sepal length (cm)"的列,并将其转换为浮点数类型。
s=size
:设置气泡的大小,也就是将"sepal length (cm)"列的数值大小,当作气泡的面积大小,或者说半径大小。
④
alpha=0.6
设置气泡的透明度,取值范围为0到1,其中0表示完全透明,1表示完全不透明。
综上,通过调用plt.scatter()
函数并传入相应的参数,绘制出气泡图,其中横坐标表示"sepal length (cm)"列的值,纵坐标表示"sepal width (cm)"列的值,点的大小由size
变量控制,点的透明度为0.6。
结果如下图:
图中气泡大小有大有小,但是总体来说都很小,差别不是很大,那么如何将气泡大小差异明显化呢?请看下一节的 四、画气泡图--进阶版一
四、画气泡图--进阶版一 (控制气泡大小)
那么我们进行怎样的操作,气泡图能够从上边的形式,变成下边图的结果呢?
重点在size!
上边基础版的气泡图,气泡的大小为size =list(data["petal length (cm)"].astype(float)),也就是第三列"petal length (cm)"的数值大小,作为气泡的面积大小。
size =list(data["petal length (cm)"].astype(float)/0.002)
在这里我们将size =list(data["petal length (cm)"].astype(float))/0.002,也就是将原先size的大小除以0.002,原先的值扩大了500倍,也就是将每个气泡的面积分别扩大了原先的500倍。
解读气泡图:
从上边的气泡图,我们可以得到的信息:
①二维变量的关系:
大体上,随着x轴数据的增长,y轴数据也随之增长,可以说明speal length变量和sepal width变量是呈正相关,并且从图中可以看出是线性关系。
②三维变量的关系:
随着x轴的增长,气泡的大小有所变大,并且随着y轴的增长,气泡的大小也有所变大,可以得出结论,petal length变量与speal length变量和sepal width变量有关系,随着speal length和sepal width值的变大,petal length值也会有所增加。
五、画气泡图--进阶版二(控制气泡颜色)
气泡的颜色通常代表一个属性,如分类、状态等,不同的颜色可以区分不同的类别或状态。
例如在本例中,鸢尾花数据集的target列有三类,分别是0、1、2类,分别对应的实际意义是
0:山鸢尾花(Iris Setosa)
1:变色鸢尾花(Iris Versicolor)
2:维吉尼亚鸢尾花(Iris Virginica)
那么下面就实现将不同类别的样本对应的气泡赋予不同颜色
(一)用参数c控制气泡颜色
plt.scatter(data["sepal length (cm)"].astype(float),
data["sepal width (cm)"].astype(float),
s=size,c=data["target"],
alpha=0.6)
就是在上边语句中加入了c=data["target"]:
设置气泡的颜色,其中data["target"]是一个列,表示每个点所属的目标类别。
结果如下:
(二)用for循环的方法控制气泡颜色
上面我们介绍了利用参数c控制气泡颜色,下边介绍用另一种方法for循环控制气泡颜色,
# 遍历所有唯一的类别并绘制气泡图
for target in data["target"].unique():
size =list(data[data["target"] == target]["petal length (cm)"].astype(float)/0.002)
plt.scatter(data[data["target"] == target]["sepal length (cm)"].astype(float),
data[data["target"] == target]["sepal width (cm)"].astype(float),
s=size, alpha=0.6)
这段代码的意思是:
根据不同的目标值(target)绘制散点图,其中每个目标值对应的数据点的大小(size)是根据花瓣长度(petal length)除以0.002得到的。
也就是先用一个颜色绘制第一类样本的气泡图,接着用另一个颜色绘制第二类样本的气泡图,最后再用另一个颜色绘制第三个样本绘制的气泡图。
这样不同类别的样本对应的气泡就赋予了不同的颜色。
结果如下:
(三)给气泡分配指定的颜色(调整气泡颜色分配)
colors = ['blue', 'yellowgreen', 'red']
for i, target in enumerate(data["target"].unique()):
size =list(data[data["target"] == target]["petal length (cm)"].astype(float)/0.002)
plt.scatter(data[data["target"] == target]["sepal length (cm)"].astype(float),
data[data["target"] == target]["sepal width (cm)"].astype(float),
s=size, alpha=0.8, c=colors[i])
使用c参数来指定气泡的颜色。
具体来说,我们可以将c参数设置为一个列表,其中包含每个数据点的颜色。
例如,我们可以将第一个类别的气泡设置为blue,第二个类别的气泡设置yellowgreen,第三个类别的气泡设置为red.
这里,我们使用enumerate()函数来获取每个类别的索引和名称,然后使用colors列表来指定每个类别的颜色。
关于enumerate()函数的介绍,小伙伴可以看我主页此文章的上一篇文章enumerate()函数讲解+同时获取索引和对应的元素值+实例-CSDN博客
结果如下:
运行代码后,我们可以看到气泡图中的颜色已经按照我们指定的颜色进行了设置
六、添加图例
上面的操作已经将不同类别的气泡赋予了不同的颜色,但是我们现在从图中还不能知道哪个颜色代表哪类样本,因此考虑添加图例。
(一)图例的一些基本设置--参数讲解
legend=plt.legend(data["target"].unique(),fontsize=5,loc='upper right',
frameon = True, framealpha=0.5,handlelength=2,
prop={'size': 15},borderpad=1.5,
facecolor = "orange",edgecolor ="blue")
# 设置图例边框的宽度
legend.get_frame().set_linewidth(3)
①data["target"].unique():以鸢尾花的三个类别当作图例标签
②fontsize=5:设置图例字体大小为5。
prop={'size': 15}`:设置图例字体大小为15
应用时,这两个参数作用类似,只设置一个即可。
③loc='upper right':设置图例位置为右上角
loc参数可选如下:
'upper right':右上 'upper left' :左上 'lower left':左下 'lower right':右下
除此之外,还可以通过bbox_to_anchor参数调整图例的位置:
bbox_to_anchor参数设置为(1.05, 1),表示图例的位于图形的右上角的某个位置。小伙伴可以根据需要调整这个值。
④frameon = False去除图例边框,即不要图例的外边框。
frameon = True绘制图例的外边框
⑤framealpha:控制图例的透明度
⑥handlelength=2:设置图例标记长度为2
⑦borderpad=1.5控制图例外边框的大小
⑧facecolor = ‘orange’ 设置边框填充色为橙色
⑨edgecolor = ‘blue’ 设置图例边框的颜色为蓝色
⑩legend.get_frame().set_linewidth(3):设置图例边框的宽度
结果如下:
(二) 图例的排列方式--横向排放
上边的图例是竖列排放的,如果想让其横向排放,需要用到ncol参数
legend=plt.legend(data["target"].unique(),fontsize=10,loc='upper right',
frameon = True, framealpha=0.5,handlelength=2,
prop={'size': 15},borderpad=1.5,
facecolor = "orange",edgecolor ="blue",ncol = 3)
ncol = 3:横放,参数值为3,是因为图例中有三个标签值。
结果如下:
(三)调整图例可视化图形大小及透明度
for handle in legend.legendHandles:
handle.set_sizes([200])
handle.set_alpha(0.8)
这段代码的主要作用是调整matplotlib图例中的可视化图形大小和透明度。
使用set_sizes()和set_alpha()方法来调整标记的大小和透明度。
这里我们将所有标记的大小设置为200,透明度设置为0.8。
运行代码,我们可以看到一个包含定制标记大小和透明度的图例
结果如下:
(四)给图例添加标题
legend.set_title("图例")
legend.get_title().set_fontsize(fontsize = 25)
设置图例的标题为“图例”,并设置“图例”的字体大小为25。
结果如下:
(五) 将图例设置到图像外侧
legend=plt.legend(data["target"].unique(),fontsize=10,
frameon = True, framealpha=0.5,handlelength=2,
prop={'size': 15},borderpad=1,facecolor = "orange",
edgecolor ="blue",ncol = 3,bbox_to_anchor=(1, 0.8))
plt.subplots_adjust(right=0.8)
plt.subplots_adjust(right=0.8) :将右侧边缘调整至距离整体图形边缘 0.8 个单位
bbox_to_anchor=(1, 0.8):图例的位置
引入bbox_to_anchor=(1, 0.8)参数,以及设置plt.subplots_adjust(right=0.8) 就可以实现如下图的结果:
再次解读气泡图:
从上边的气泡图中,我们可以看出大体上每一类的气泡都集中在某一大小范围内。
也就是说同一类之间或者组内之间的气泡大小差异不大,或者说同一类之间petal length这个变量的差异不大。
同时也可以看出,红色的2类鸢尾花样本的petal length值最大,其次是绿色的1类鸢尾花样本,最后是蓝色的0类鸢尾花样本,它的petal length值大体上最小。
说明petal length变量在组间差异明显,在组内差异不明显,即petal length变量对鸢尾花数据进行target分类有明显的鉴别作用。
七、完整代码
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import seaborn as sns
iris = load_iris()
# 这里,`load_iris()`函数从sklearn库中加载鸢尾花数据集
X = iris.data
Y = iris.target
# 并将数据和目标变量分别存储在X和Y中。
# X表示花瓣长度、花瓣宽度、花萼长度和花萼宽度等特征,Y表示三个品种(setosa,versicolor,virginica)的标签。
# 将X和Y转换为DataFrame
data = pd.DataFrame(X, columns=iris.feature_names)
data['target'] = Y
plt.figure(figsize=(15,10))#图形长、宽
plt.rcParams['font.sans-serif'] = ['SimHei']# 中文显示
size =list(data["petal length (cm)"].astype(float)/0.002)
colors = ['blue', 'yellowgreen', 'red']
for i, target in enumerate(data["target"].unique()):
size =list(data[data["target"] == target]["petal length (cm)"].astype(float)/0.002)
plt.scatter(data[data["target"] == target]["sepal length (cm)"].astype(float),
data[data["target"] == target]["sepal width (cm)"].astype(float),
s=size, alpha=0.8, c=colors[i])
plt.xlabel('sepal length (cm)',fontsize=20) # 横坐标轴标题
plt.gca().xaxis.set_label_coords(0.5, -0.1) # 调整X轴标题与X轴的距离
plt.ylabel('sepal width (cm)',fontsize=20) # 纵坐标轴标题
plt.gca().yaxis.set_label_coords(-0.08, 0.5) # 调整y轴标题与y轴的距离
plt.title("气泡图",fontsize=30,pad=15)
plt.tick_params(labelsize=20) #刻度字体大小20
legend=plt.legend(data["target"].unique(),fontsize=5,loc='upper right',
frameon = True, framealpha=0.5,handlelength=2,
prop={'size': 15},borderpad=1.5,
facecolor = "orange",edgecolor ="blue",ncol=3)
# 设置图例边框的宽度
legend.get_frame().set_linewidth(3)
for handle in legend.legendHandles:
handle.set_sizes([200])
handle.set_alpha(0.8)
legend.set_title("图例")
legend.get_title().set_fontsize(fontsize = 25)
#将图例设置到图像外侧
#legend=plt.legend(data["target"].unique(),fontsize=10,
#frameon = True, framealpha=0.5,handlelength=2,
#prop={'size': 15},borderpad=1,facecolor = "orange",
#edgecolor ="blue",ncol = 3,bbox_to_anchor=(1, 0.8))
#plt.subplots_adjust(right=0.8)
plt.show()