37、使用Seaborn样式和调色板【用Python进行AI数据分析进阶教程】

用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 种预设的样式,分别是 darkgridwhitegriddarkwhite 和 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数据分析进阶教程》专栏
2AI大模型应用实践进阶教程《AI大模型应用实践进阶教程》专栏
3Python编程知识集锦《Python编程知识集锦》专栏
4字节跳动旗下AI制作抖音视频《字节跳动旗下AI制作抖音视频》专栏
5智能辅助驾驶《智能辅助驾驶》专栏
6工具软件及IT技术集锦《工具软件及IT技术集锦》专栏

👉 关注我 @理工男大辉郎 获取实时更新

欢迎关注、收藏或转发。
敬请关注 我的
微信搜索公众号:cnFuJH
CSDN博客:理工男大辉郎
抖音号:31580422589

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

理工男大辉郎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值