用Python进行AI数据分析进阶教程37:
使用Seaborn样式和调色板
关键词:Seaborn、样式、调色板、预设样式、调色板类型
摘要:Seaborn提供了丰富的样式和调色板选项,帮助创建美观专业的数据可视化图表。在样式方面,Seaborn有5种预设样式(darkgrid、whitegrid、dark、white、ticks),可通过sns.set_style()全局设置或sns.axes_style()临时设置。选择样式时需考虑数据特点和可视化目的,避免样式冲突。在调色板方面,Seaborn提供定性(区分类别)、顺序(表示数值大小)、发散(表示偏离中心值)等多种类型调色板,可使用sns.color_palette()选择或sns.set_palette()全局设置,还支持自定义调色板。选择调色板时需考虑颜色对比度和色盲友好性。通过合理使用Seaborn的样式和调色板,可使数据可视化图表更加美观、易读和专业。
👉 欢迎订阅🔗
《用Python进行AI数据分析进阶教程》专栏
《AI大模型应用实践进阶教程》专栏
《Python编程知识集锦》专栏
《字节跳动旗下AI制作抖音视频》专栏
《智能辅助驾驶》专栏
《工具软件及IT技术集锦》专栏
Seaborn 提供了丰富的样式和调色板选项,能帮助我们创建更加美观和专业的数据可视化图表。下面详细介绍 Seaborn 样式和调色板的使用,包括关键点、注意点和示例。
一、Seaborn 样式
1、关键点
● 预设样式:Seaborn 提供了 5 种预设的样式,分别是 darkgrid、whitegrid、dark、white 和 ticks。这些样式可以快速改变图表的整体外观,包括背景颜色、网格线等。
● 全局设置:使用 sns.set_style() 函数可以全局设置图表的样式,即之后绘制的所有图表都会应用该样式。
● 临时样式:使用 sns.axes_style() 函数可以临时设置样式,通过上下文管理器 with 来限定样式的作用范围。
2、注意点
● 样式冲突:如果同时使用 Seaborn 和 Matplotlib 进行样式设置,可能会出现样式冲突。建议优先使用 Seaborn 的样式设置函数。
● 与数据匹配:选择的样式要与数据的特点和可视化目的相匹配。例如,对于需要突出数据对比的图表,whitegrid 样式可能更合适;对于需要简洁背景的图表,white 样式可能更好。
3、示例代码
Python脚本
# 导入 seaborn 库,它是基于 matplotlib 的数据可视化库,
# 提供了高级接口,方便绘制各种具有统计意义的图表,
# 使用别名 sns 便于后续调用
import seaborn as sns
# 导入 matplotlib 库的 pyplot 模块,这是 Python 中常用的绘图工具,
# 用于创建、操作和展示各种图形,使用别名 plt 便于后续操作
import matplotlib.pyplot as plt
# 加载示例数据集
# 调用 seaborn 的 load_dataset 函数,加载内置的 "tips" 数据集,
# 该数据集包含餐厅顾客的消费信息,如总账单金额、小费金额等,
# 将加载的数据集存储在变量 tips 中,tips 是一个 pandas 的 DataFrame 对象
tips = sns.load_dataset("tips")
# 设置样式为 darkgrid
# 使用 seaborn 的 set_style 函数,将全局绘图样式设置为 "darkgrid",
# "darkgrid" 样式具有深色背景和白色网格线,之后绘制的图表都会应用此样式
sns.set_style("darkgrid")
# 创建一个新的图形窗口
# 调用 matplotlib 的 figure 函数,创建一个新的图形窗口,用于后续绘制图形
plt.figure()
# 绘制散点图
# 使用 seaborn 的 scatterplot 函数绘制散点图,
# x="total_bill" 表示将 tips 数据集中的 "total_bill" 列作为 x 轴数据,即总账单金额,
# y="tip" 表示将 tips 数据集中的 "tip" 列作为 y 轴数据,即小费金额,
# data=tips 表示使用 tips 数据集来绘制散点图
sns.scatterplot(x="total_bill", y="tip", data=tips)
# 设置图形标题
# 调用 matplotlib 的 title 函数,为当前图形设置标题为 "darkgrid 样式",
# 方便用户直观识别该图形所使用的样式
plt.title("darkgrid 样式")
# 临时设置样式为 white
# 使用 seaborn 的 axes_style 函数结合 with 语句创建一个上下文管理器,
# 在这个上下文管理器中,临时将绘图样式设置为 "white","white" 样式具有白色背景且无网格线,
# 此样式仅在 with 语句块内生效,不会影响后续的绘图样式
with sns.axes_style("white"):
# 创建一个新的图形窗口
# 在临时样式的作用域内,调用 matplotlib 的 figure 函数,创建一个新的图形窗口
plt.figure()
# 绘制散点图
# 同样使用 seaborn 的 scatterplot 函数,以 "total_bill" 列作为 x 轴数据,
# "tip" 列作为 y 轴数据,使用 tips 数据集绘制散点图
sns.scatterplot(x="total_bill", y="tip", data=tips)
# 设置图形标题
# 调用 matplotlib 的 title 函数,为当前图形设置标题为 "white 样式",
# 方便用户直观识别该图形所使用的样式
plt.title("white 样式")
# 显示所有绘制的图形
# 调用 matplotlib 的 show 函数,将之前创建的所有图形窗口显示出来
# 输出结果:会弹出两个图形窗口,
# 第一个窗口显示的是在 "darkgrid" 样式下,
# 总账单金额和小费金额的散点图,有深色背景和白色网格线;
# 第二个窗口显示的是在 "white" 样式下,同样数据的散点图,具有白色背景且无网格线
plt.show()
在上述示例中,首先使用 sns.set_style("darkgrid") 全局设置样式为 darkgrid,并绘制一个散点图。然后使用 with sns.axes_style("white") 临时设置样式为 white,在这个上下文管理器中绘制另一个散点图。
——【小插曲】——
由于以上脚本执行后,生成的图中的中文无法正常显示。为此,进行了多轮调试后,得到以下脚本使得图中的中文可以正常显示。与上面的脚本相比,主要是增加了处理中文显示的问题,这部分代码段如下:
# 查找可用的中文字体
def find_chinese_font():
"""查找系统中可用的中文字体"""
# 定义常见中文字体列表
chinese_fonts = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC",
"Microsoft YaHei", "Arial Unicode MS", "SimSun"]
# 检查字体是否可用
available_fonts = [f.name for f in fm.fontManager.ttflist]
# 尝试列表中的字体
for font in chinese_fonts:
if font in available_fonts:
return font
# 如果没有找到预定义字体,尝试自动检测
system_fonts = fm.findSystemFonts()
if os.name == 'nt': # Windows
for f in system_fonts:
if "simhei.ttf" in f.lower() or "microsoftyahei.ttf" in f.lower():
return fm.FontProperties(fname=f).get_name()
elif os.name == 'posix': # macOS/Linux
for f in system_fonts:
if "hei" in f.lower() or "microhei" in f.lower() or "heiti" in f.lower():
return fm.FontProperties(fname=f).get_name()
return None
# 获取中文字体
chinese_font = find_chinese_font()
if chinese_font:
print(f"找到中文字体: {chinese_font}")
else:
print("警告: 未找到中文字体,将使用默认字体")
同时,在每个生成图的代码段之前,加了中文字体选择和设置:
# 创建 darkgrid 样式图形
plt.figure(figsize=(10, 6))
sns.set_style("darkgrid")
# 设置此图形的字体
if chinese_font:
plt.rcParams["font.family"] = chinese_font
# 绘制 darkgrid 样式图
ax1 = sns.scatterplot(x="total_bill", y="tip", data=tips)
ax1.set_title("darkgrid 样式", fontname=chinese_font)
ax1.set_xlabel("总账单金额", fontname=chinese_font)
ax1.set_ylabel("小费金额", fontname=chinese_font)
# 创建 white 样式图形
plt.figure(figsize=(10, 6))
# 设置此图形的字体
if chinese_font:
plt.rcParams["font.family"] = chinese_font
# 使用 white 样式上下文
with sns.axes_style("white"):
# 绘制 white 样式图
ax2 = sns.scatterplot(x="total_bill", y="tip", data=tips)
# 为这个特定的图表对象设置中文字体
if chinese_font:
ax2.set_title("white 样式", fontname=chinese_font)
ax2.set_xlabel("总账单金额", fontname=chinese_font)
ax2.set_ylabel("小费金额", fontname=chinese_font)
经过中文显示处理后的全量脚本如下:
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import os
# 加载示例数据集
tips = sns.load_dataset("tips")
# 查找可用的中文字体
def find_chinese_font():
"""查找系统中可用的中文字体"""
# 定义常见中文字体列表
chinese_fonts = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC",
"Microsoft YaHei", "Arial Unicode MS", "SimSun"]
# 检查字体是否可用
available_fonts = [f.name for f in fm.fontManager.ttflist]
# 尝试列表中的字体
for font in chinese_fonts:
if font in available_fonts:
return font
# 如果没有找到预定义字体,尝试自动检测
system_fonts = fm.findSystemFonts()
if os.name == 'nt': # Windows
for f in system_fonts:
if "simhei.ttf" in f.lower() or "microsoftyahei.ttf" in f.lower():
return fm.FontProperties(fname=f).get_name()
elif os.name == 'posix': # macOS/Linux
for f in system_fonts:
if "hei" in f.lower() or "microhei" in f.lower() or "heiti" in f.lower():
return fm.FontProperties(fname=f).get_name()
return None
# 获取中文字体
chinese_font = find_chinese_font()
if chinese_font:
print(f"找到中文字体: {chinese_font}")
else:
print("警告: 未找到中文字体,将使用默认字体")
# 创建 darkgrid 样式图形
plt.figure(figsize=(10, 6))
sns.set_style("darkgrid")
# 设置此图形的字体
if chinese_font:
plt.rcParams["font.family"] = chinese_font
# 绘制 darkgrid 样式图
ax1 = sns.scatterplot(x="total_bill", y="tip", data=tips)
ax1.set_title("darkgrid 样式", fontname=chinese_font)
ax1.set_xlabel("总账单金额", fontname=chinese_font)
ax1.set_ylabel("小费金额", fontname=chinese_font)
# 创建 white 样式图形
plt.figure(figsize=(10, 6))
# 设置此图形的字体
if chinese_font:
plt.rcParams["font.family"] = chinese_font
# 使用 white 样式上下文
with sns.axes_style("white"):
# 绘制 white 样式图
ax2 = sns.scatterplot(x="total_bill", y="tip", data=tips)
# 为这个特定的图表对象设置中文字体
if chinese_font:
ax2.set_title("white 样式", fontname=chinese_font)
ax2.set_xlabel("总账单金额", fontname=chinese_font)
ax2.set_ylabel("小费金额", fontname=chinese_font)
# 显示图形
plt.tight_layout()
plt.show()
这段全量脚本执行后生成的图如下:
——【小插曲】完——
二、Seaborn 调色板
1、关键点
● 调色板类型:Seaborn 提供了多种类型的调色板,包括定性调色板(用于区分不同类别)、顺序调色板(用于表示数值的大小)和发散调色板(用于表示偏离中心值的情况)。
● 调色板选择:可以使用 sns.color_palette() 函数选择不同的调色板,也可以使用 sns.set_palette() 函数全局设置调色板。
● 自定义调色板:可以通过传入颜色列表来创建自定义调色板。
2、注意点
● 颜色对比度:选择的颜色要具有足够的对比度,以便于区分不同的类别或数值。
● 色盲友好:在选择颜色时,要考虑色盲人群的视觉感受,尽量选择色盲友好的调色板。
3、示例代码
Python脚本
# 导入 seaborn 库,它是基于 matplotlib 的高级数据可视化库,
# 提供了丰富的统计图表绘制功能,使用别名 sns 方便后续调用
import seaborn as sns
# 导入 matplotlib 库的 pyplot 模块,它是 Python 中常用的绘图工具,
# 用于创建和显示图形,使用别名 plt 方便后续操作
import matplotlib.pyplot as plt
# 加载示例数据集
# 调用 seaborn 的 load_dataset 函数加载内置的 "tips" 数据集,
# 该数据集包含餐厅顾客的消费信息,如用餐日期、总账单金额、顾客性别等
# 将加载的数据集存储在变量 tips 中,tips 是一个 pandas 的 DataFrame 对象
tips = sns.load_dataset("tips")
# 设置支持中文的字体
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
# 设置定性调色板
# 调用 seaborn 的 set_palette 函数,将全局调色板设置为 "Set1" 调色板
# "Set1" 是 seaborn 预定义的定性调色板,适合用于区分不同的类别
sns.set_palette("Set1")
# 创建一个新的图形窗口
# 调用 matplotlib 的 figure 函数创建一个新的图形窗口,用于绘制接下来的图形
plt.figure()
# 绘制柱状图
# 调用 seaborn 的 barplot 函数绘制柱状图
# x="day" 表示将 "day" 列(用餐日期)作为 x 轴的数据
# y="total_bill" 表示将 "total_bill" 列(总账单金额)作为 y 轴的数据
# hue="sex" 表示按照 "sex" 列(顾客性别)对数据进行分组,不同性别用不同颜色的柱子表示
# data=tips 表示使用 tips 数据集来绘制柱状图
sns.barplot(x="day", y="total_bill", hue="sex", data=tips)
# 设置图形标题
# 调用 matplotlib 的 title 函数为当前图形设置标题,显示该图形使用的是 "Set1" 定性调色板
plt.title("定性调色板(Set1)")
# 创建自定义调色板
# 定义一个包含三个十六进制颜色代码的列表 custom_palette,分别是红色、绿色和蓝色
# 这个列表将作为自定义调色板使用
custom_palette = ["#FF0000", "#00FF00", "#0000FF"]
# 设置自定义调色板
# 再次调用 seaborn 的 set_palette 函数,将全局调色板设置为自定义的 custom_palette
sns.set_palette(custom_palette)
# 创建一个新的图形窗口
# 调用 matplotlib 的 figure 函数创建一个新的图形窗口,用于绘制使用自定义调色板的柱状图
plt.figure()
# 绘制柱状图
# 同样调用 seaborn 的 barplot 函数,以相同的 x 轴、y 轴和分组信息,
# 使用更新后的自定义调色板绘制柱状图
sns.barplot(x="day", y="total_bill", hue="sex", data=tips)
# 设置图形标题
# 调用 matplotlib 的 title 函数为当前图形设置标题,显示该图形使用的是自定义调色板
plt.title("自定义调色板")
# 显示所有绘制的图形
# 调用 matplotlib 的 show 函数,将之前创建的两个图形窗口显示出来
# 输出结果:会弹出两个图形窗口
# 第一个窗口展示的是使用 "Set1" 定性调色板绘制的柱状图,x 轴为用餐日期,
# y 轴为总账单金额,不同性别用 "Set1" 调色板中的不同颜色区分
# 第二个窗口展示的是使用自定义调色板(红、绿、蓝)绘制的柱状图,
# 同样 x 轴为用餐日期,y 轴为总账单金额,不同性别用自定义的红、绿、蓝颜色区分
plt.show()
在上述示例中,首先使用 sns.set_palette("Set1") 设置定性调色板为 Set1,并绘制一个柱状图。然后创建一个自定义调色板 custom_palette,并使用 sns.set_palette(custom_palette) 设置为当前调色板,再绘制另一个柱状图。
通过合理使用 Seaborn 的样式和调色板,可以使数据可视化图表更加美观、易读和专业。
——The END——
🔗 欢迎订阅专栏
序号 | 专栏名称 | 说明 |
---|---|---|
1 | 用Python进行AI数据分析进阶教程 | 《用Python进行AI数据分析进阶教程》专栏 |
2 | AI大模型应用实践进阶教程 | 《AI大模型应用实践进阶教程》专栏 |
3 | Python编程知识集锦 | 《Python编程知识集锦》专栏 |
4 | 字节跳动旗下AI制作抖音视频 | 《字节跳动旗下AI制作抖音视频》专栏 |
5 | 智能辅助驾驶 | 《智能辅助驾驶》专栏 |
6 | 工具软件及IT技术集锦 | 《工具软件及IT技术集锦》专栏 |
👉 关注我 @理工男大辉郎 获取实时更新
欢迎关注、收藏或转发。
敬请关注 我的
微信搜索公众号:cnFuJH
CSDN博客:理工男大辉郎
抖音号:31580422589