(代码详解)绘制气泡图+详细讲解图例设置+如何正确理解气泡图+气泡大小、颜色+调参

您所在的位置:网站首页 气泡图用途 (代码详解)绘制气泡图+详细讲解图例设置+如何正确理解气泡图+气泡大小、颜色+调参

(代码详解)绘制气泡图+详细讲解图例设置+如何正确理解气泡图+气泡大小、颜色+调参

2024-07-10 19:33| 来源: 网络整理| 查看: 265

目录

 气泡图简介:

一、导入库

二、准备数据

三、画气泡图--基础版

四、画气泡图--进阶版一 (控制气泡大小)

解读气泡图:

五、画气泡图--进阶版二(控制气泡颜色)

(一)用参数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()



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3