【Seaborn 学习笔记】P1.关系图:散点图 scatterplot、折线图 lineplot
matplotlib 画图seaborn 画变量关系seaborn本质上是在 matplotlib 的画布上画图安装 Seaborn使用 pip 安装pip install seaborn在 Python 中导入 Seaborn 库导入并取别名为 snsimport seaborn as sns加载 Seaborn 内置数据集Seaborn 拥有内置数据集可以直接加载返回 DataFrame 类型的数据集1. 查看内置数据集import seaborn as sns dataset_names sns.get_dataset_names() print(dataset_names)返回如下结果[anagrams, anscombe, attention, brain_networks, car_crashes, diamonds, dots, dowjones, exercise, flights, fmri, geyser, glue, healthexp, iris, mpg, penguins, planets, seaice, taxis, tips, titanic]2. 加载数据集返回的是 pandas 的 DataFrame 数据类型import seaborn as sns # 例如加载 iris 数据集 df sns.load_dataset(iris) # 返回 DataFrame 数据类型 # 查看前五条记录 print(df.head())结果如下sepal_length sepal_width petal_length petal_width species0 5.1 3.5 1.4 0.2 setosa1 4.9 3.0 1.4 0.2 setosa2 4.7 3.2 1.3 0.2 setosa3 4.6 3.1 1.5 0.2 setosa4 5.0 3.6 1.4 0.2 setosa散点图绘制 sns.scatterplot每条记录对应一个点seaborn 的 sns.scatterplot 相比 matplotlib 的 plt.scatter 多了三个关键统计语义hue分组指定一个特征给 hue对于不同的该特征绘制的点映射不同颜色style点的样式指定一个特征给 style对于不同的该特征绘制的点会使用不同的样式。用于区分第二分类维度size点的大小指定一个特征给 size若一条记录的该特征越大绘制的点也就越大示例绘制 penguins 数据集中企鹅的鳍长flipper_length_mm关于体重body_mass_g的散点图。首先加载数据集import seaborn as sns # 加载数据集 df sns.load_dataset(penguins) df.head()peguins 数据集形如1. 绘制一个普通的散点图# 绘制散点图 sns.scatterplot(datadf, xflipper_length_mm, ybody_mass_g) # seaborn 会自动忽略含有 NaN 的行不会报错 plt.show() # 使用 mpl 来显示图片 - sns 在 mpl 的画布上画图由 mpl 来显示图片绘图结果如下2. 加入参数 hue对指定特征不同的记录在画图时映射不同的颜色# 加入分类变量 hue sns.scatterplot( datadf, xflipper_length_mm, ybody_mass_g, huespecies # 将对每个点根据其 species 标注不同颜色 ) # 根据 hue 映射颜色 # seaborn 会自动生成 legend plt.show()绘图结果如下3. 加入参数 style对指定特征不同的记录在画图时使用不同的点的样式# 再加入点的样式 style sns.scatterplot( datadf, xflipper_length_mm, ybody_mass_g, huespecies, # 将对每个点根据其 species 标注不同颜色 stylesex # 将对每个点根据其 sex 选择不同的点的样式 ) # 根据 style 选择不同标记 # 适合在 hue 的基础上进行二次分类的情形 plt.show()绘图结果如下使用 Axes 对象精细化控制Seaborn 的大部分绘图函数都会返回一个 matplotlib.axes.Axes 对象因此不需要显示创建画布就可以拿到绘图后的 Axes并通过这个 Axes 对绘制的图形进行精细化控制。Axes 对象有关方法方法功能ax.set_title(标题)标题ax.set_xlabel(x轴标签)ax.set_ylabel(y轴标签)坐标轴标签ax.set_xlim(left?, right?)ax.set_ylim(bottom?, top?)坐标轴范围ax.set_xticks(x值的序列)ax.set_yticks(y值的序列)刻度ax.legend(title图例标题, locupper right)loc 表示图例的位置还可为 1. 最佳位置best自动选最不挡数据的位置2. 四个角与四条边中间upper, lower, center 与 left, right, center 的组合中间用空格隔开例如 upper center 表示上方居中3. 坐标系正中间center容易挡住数据图例ax.grid(True) # x、y轴网格线ax.grid(True, axis‘x) # 仅 x 轴网格线ax.grid(True, axisy) # 仅 y 轴网格线网格ax.axhline()ax.axvline()参考线ax.text()ax.annotate()文本ax.spines[] # 用字典形式对某边框进行操作包括边框显示与隐藏、粗细、颜色等# 隐藏上、右边框for spine in [top, right]:ax.spines[spine].set_visible(False)边框1. 示例import seaborn as sns import matplotlib as mpl import matplotlib.pyplot as plt df sns.load_dataset(penguins) df.head() mpl.rcParams[font.family] SimHei mpl.rcParams[font.size] 15 # 这里将返回的 Axes 对象存变量 ax ax sns.scatterplot( datadf, xflipper_length_mm, ybody_mass_g, huespecies ) # 添加 x、y 轴标签 ax.set_xlabel(鳍长 (mm)) ax.set_ylabel(体重 (g)) ax.legend(title物种) # 修改图例标题 ax.grid(True) # 网格线 plt.show()绘图结果如下2. 图例外置若图例在图中会遮挡数据可以使用 ax.legend() 方法将其放在图的外面要配合 plt.tight_layout() 使用否则图例可能会跑出画布ax.legend( title图例标题, bbox_to_anchor(x坐标, y坐标), # 对齐坐标(0, 0) 表示 ax 的左下角(1, 1) 表示 ax 的右上角 loc对齐方式 # 指定图例的哪个角或边中点与该坐标对齐 )例如将图例放在图的右侧常用写法ax.legend( title图例标题, bbox_to_anchor(1.02, 1), # 对齐坐标(1.02, 1)表示图的右上角往右0.02距离的点 locupper left # 指定图例的左上角与 (1.02, 1) 点对齐 )结果形如散点图练习1. 使用 penguins 数据集x 轴为喙长bill_length_mmy 轴为喙深bill_depth_mm并且按 species 映射颜色画出散点图加上合适的标题和轴标签画在子图12. 在 1 的基础上用 sex 区分性别画在子图2图例均放在图的右侧# 本人思路仅供参考 import seaborn as sns import matplotlib as mpl import matplotlib.pyplot as plt df sns.load_dataset(penguins) df.head() mpl.rcParams[font.family] SimHei mpl.rcParams[font.size] 15 # 使用 2×1 的垂直布局便于对比“仅按种类着色”与“按种类性别区分”的差异 fig, (ax1, ax2) plt.subplots(2, 1, figsize(12, 14), dpi100) # 同时获得画布 fig 与两幅子图 ax1, ax2 # 子图1 sns.scatterplot( datadf, xbill_length_mm, ybill_depth_mm, huespecies, axax1 ) ax1.set_title(喙长-喙深 对比图) ax1.set_xlabel(喙长 (mm)) ax1.set_ylabel(喙深 (mm)) # 将图例放到图的右侧 ax1.legend( title分组, locupper left, # 图例的左上角 bbox_to_anchor(1.02, 1) # 对齐到 ax1 的右侧 ) # 子图2 sns.scatterplot( datadf, xbill_length_mm, ybill_depth_mm, huespecies, stylesex, axax2 ) ax2.set_title(喙长-喙深 对比图) ax2.set_xlabel(喙长 (mm)) ax2.set_ylabel(喙深 (mm)) # 将图例放到图的右侧 ax2.legend( title物种 / 性别, locupper left, # 图例的左上角 bbox_to_anchor(1.02, 1) # 对齐到 ax2 的右侧 ) plt.tight_layout() plt.show()绘图结果如下折线图绘制 sns.lineplot