
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