6.2 图形风格 (Plot Styles) 第六章:Seaborn图形定制与美化 - 6.2 图形风格 (Plot Styles) 详解与实践 Seaborn,作为Python数据可视化库的佼佼者,建立在Matplotlib之上,旨在创建更具吸引力和信息量的统计图形。在图形定制与美化方面,Seaborn提供了丰富的工具和选项,其中 图形风格 (Plot Styles) 是至关重要的一环。它如同为画布选择底色和纹理,直接影响着图形的整体观感和信息传递的效率。 6.2.1 理解Seaborn的图形风格 Seaborn的图形风格,本质上是预定义的 主题 (Themes) 的一种简化应用。它允许用户通过简单的命令,快速切换图形的整体视觉风格,包括背景颜色、网格线、轴线样式、字体颜色等。
Seaborn,作为Python数据可视化库的佼佼者,建立在Matplotlib之上,旨在创建更具吸引力和信息量的统计图形。在图形定制与美化方面,Seaborn提供了丰富的工具和选项,其中 图形风格 (Plot Styles) 是至关重要的一环。它如同为画布选择底色和纹理,直接影响着图形的整体观感和信息传递的效率。
Seaborn的图形风格,本质上是预定义的 主题 (Themes) 的一种简化应用。它允许用户通过简单的命令,快速切换图形的整体视觉风格,包括背景颜色、网格线、轴线样式、字体颜色等。这些预设风格旨在适应不同的数据类型、展示场景以及个人审美偏好。
Seaborn 提供了五种内置的图形风格,可以通过 seaborn.set_style() 函数进行设置:
darkgrid: 默认风格,深灰色背景,带有白色网格线。适用于需要强调数据点,并提供辅助参考线的场景。
whitegrid: 白色背景,带有灰色网格线。相较于 darkgrid 更加简洁明亮,网格线不那么突出,适合需要清晰展示数据趋势,同时保持画面整洁的场景。
dark: 深灰色背景,无网格线。风格简约,专注于数据本身,适合需要突出数据差异,弱化背景干扰的场景。
white: 白色背景,无网格线。最简洁的风格,强调数据的清晰度和可读性,适用于需要呈现干净、专业的视觉效果的场景。
ticks: 白色背景,无网格线,但轴线带有刻度线 (ticks)。在 white 风格的基础上,增加了刻度线,更清晰地标示数据轴的范围和刻度,适合需要精确读取数值的场景。
这些风格并非孤立存在,它们可以被进一步定制和组合,以满足更个性化的需求。在深入定制之前,熟练掌握和应用这些内置风格是至关重要的基础。
为了更直观地展示不同风格的效果,我们将通过一系列代码示例,分别应用这五种内置风格,并进行详细的解释。
准备工作:导入必要的库
import seaborn as sns import matplotlib.pyplot as plt import numpy as np import pandas as pd # 设置 Matplotlib 正常显示中文和负号 plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为 SimHei plt.rcParams['axes.unicode_minus'] = False # 解决负号显示为方块的问题
示例数据:生成模拟数据
为了演示不同风格在实际图形中的效果,我们生成一些模拟数据,包括数值型和类别型数据。
# 生成数值型数据 np.random.seed(0) x = np.linspace(0, 10, 100) y1 = np.sin(x) + np.random.randn(100) * 0.5 y2 = np.cos(x) + np.random.randn(100) * 0.5 # 生成类别型数据 categories = ['A', 'B', 'C', 'D', 'E'] values = np.random.randint(10, 50, size=len(categories)) category_data = pd.DataFrame({'Category': categories, 'Value': values})
1. darkgrid 风格
sns.set_style("darkgrid") plt.figure(figsize=(8, 6)) plt.plot(x, y1, label='曲线 1') plt.plot(x, y2, label='曲线 2') plt.title('Darkgrid 风格示例') plt.xlabel('X轴') plt.ylabel('Y轴') plt.legend() plt.show()
代码详解:
sns.set_style("darkgrid"): 这行代码设置全局的Seaborn图形风格为 darkgrid。后续所有使用Seaborn或Matplotlib绘制的图形,只要没有显式更改风格,都将应用此风格。
plt.figure(figsize=(8, 6)): 创建 Matplotlib 图形对象,并设置图形大小为 8x6 英寸。
plt.plot(x, y1, label='曲线 1') 和 plt.plot(x, y2, label='曲线 2'): 绘制两条折线图,并添加标签,用于图例显示。
plt.title('Darkgrid 风格示例'), plt.xlabel('X轴'), plt.ylabel('Y轴'), plt.legend(): 设置图形标题、轴标签和图例。
plt.show(): 显示图形。
图形效果分析:
darkgrid 风格的图形,背景为深灰色,网格线为白色。这种风格的优点在于:
突出数据: 深色背景与浅色数据线条形成鲜明对比,更容易吸引用户的注意力到数据本身。
辅助参考: 白色网格线为数据点的定位和数值读取提供了辅助参考,尤其在需要精确比较数据点位置时非常有用。
经典稳重: 深色背景给人一种经典、稳重的感觉,适用于正式的报告和演示场合。
mermaid graph TD 图示:
2. whitegrid 风格
sns.set_style("whitegrid") plt.figure(figsize=(8, 6)) plt.plot(x, y1, label='曲线 1') plt.plot(x, y2, label='曲线 2') plt.title('Whitegrid 风格示例') plt.xlabel('X轴') plt.ylabel('Y轴') plt.legend() plt.show()
代码详解:
代码结构与 darkgrid 示例完全一致,仅需将 sns.set_style("darkgrid") 替换为 sns.set_style("whitegrid") 即可。
图形效果分析:
whitegrid 风格的图形,背景为白色,网格线为灰色。与 darkgrid 相比,whitegrid 风格:
更加明亮: 白色背景使得整体画面更加明亮、清新,更符合现代审美。
网格线弱化: 灰色网格线相较于白色网格线,视觉冲击力更弱,不会过于抢占数据的注意力。
简洁清爽: 整体风格更加简洁清爽,适用于需要突出数据趋势,同时保持画面整洁的场景。
mermaid graph TD 图示:
3. dark 风格
sns.set_style("dark") plt.figure(figsize=(8, 6)) plt.plot(x, y1, label='曲线 1') plt.plot(x, y2, label='曲线 2') plt.title('Dark 风格示例') plt.xlabel('X轴') plt.ylabel('Y轴') plt.legend() plt.show()
代码详解:
同样,只需将 sns.set_style() 函数的参数修改为 "dark"。
图形效果分析:
dark 风格的图形,背景为深灰色,没有网格线。这种风格的特点是:
极致简约: 移除了网格线,使得画面更加简洁,专注于数据本身。
高对比度: 深色背景与浅色数据线条形成高对比度,突出数据差异,强化视觉冲击力。
现代感: 简约的设计风格更具现代感,适用于追求简洁、直接的数据展示。
mermaid graph TD 图示:
4. white 风格
sns.set_style("white") plt.figure(figsize=(8, 6)) plt.plot(x, y1, label='曲线 1') plt.plot(x, y2, label='曲线 2') plt.title('White 风格示例') plt.xlabel('X轴') plt.ylabel('Y轴') plt.legend() plt.show()
代码详解:
将 sns.set_style() 函数的参数修改为 "white"。
图形效果分析:
white 风格的图形,背景为白色,没有网格线。它是最简洁的风格之一:
极致简洁: 白色背景和无网格线,将简洁性发挥到极致,最大程度地减少视觉干扰。
清晰易读: 白色背景与深色数据线条形成清晰对比,数据易于阅读和理解。
专业性: 简洁的设计风格通常被认为更具专业性,适用于学术论文、商业报告等正式场合。
mermaid graph TD 图示:
5. ticks 风格
sns.set_style("ticks") plt.figure(figsize=(8, 6)) plt.plot(x, y1, label='曲线 1') plt.plot(x, y2, label='曲线 2') plt.title('Ticks 风格示例') plt.xlabel('X轴') plt.ylabel('Y轴') plt.legend() plt.show()
代码详解:
将 sns.set_style() 函数的参数修改为 "ticks"。
图形效果分析:
ticks 风格的图形,背景为白色,没有网格线,但轴线带有刻度线 (ticks)。它在 white 风格的基础上,增加了刻度线:
精确刻度: 刻度线的加入,使得轴线的刻度更加清晰可见,方便用户精确读取数据数值。
增强可读性: 刻度线在一定程度上增强了图形的可读性,尤其是在需要关注具体数值而非趋势时。
细节呈现: 刻度线作为一种细节元素,可以提升图形的精致感。
mermaid graph TD 图示:
类别型数据示例:条形图风格对比
为了进一步展示不同风格在不同图表类型上的应用,我们使用类别型数据绘制条形图,并对比 darkgrid 和 whitegrid 风格的效果。
# darkgrid 风格条形图 sns.set_style("darkgrid") plt.figure(figsize=(8, 6)) sns.barplot(x='Category', y='Value', data=category_data) plt.title('Darkgrid 风格条形图') plt.xlabel('类别') plt.ylabel('数值') plt.show() # whitegrid 风格条形图 sns.set_style("whitegrid") plt.figure(figsize=(8, 6)) sns.barplot(x='Category', y='Value', data=category_data) plt.title('Whitegrid 风格条形图') plt.xlabel('类别') plt.ylabel('数值') plt.show()
图形效果对比分析:
darkgrid 条形图: 深灰色背景与彩色条形形成对比,网格线辅助高度比较,整体风格较为突出,适合强调数值差异。
whitegrid 条形图: 白色背景更加明亮,灰色网格线弱化,条形图显得更加清新,适合展示类别之间的数值分布,同时保持画面整洁。
sns.set_style() 函数除了可以设置预定义的风格名称,还可以接受一个字典参数 rc,用于更精细地定制风格的各个方面。通过 rc 参数,我们可以修改背景颜色、网格线颜色、轴线颜色、字体、线条粗细等等。
查看当前风格参数:
可以使用 sns.axes_style() 函数获取当前风格的参数字典。
current_style = sns.axes_style() print(current_style)
输出结果将是一个字典,包含了当前风格的所有参数及其值。例如,对于 darkgrid 风格,部分参数如下:
{'axes.facecolor': '#EAEAF2', 'axes.edgecolor': 'black', 'axes.grid': True, 'axes.axisbelow': 'line', 'axes.labelcolor': 'black', 'figure.facecolor': 'white', 'grid.color': 'white', 'grid.linestyle': '-', 'text.color': 'black', 'xtick.color': 'black', 'ytick.color': 'black', 'xtick.direction': 'out', 'ytick.direction': 'out', 'lines.solid_capstyle': 'round', 'patch.edgecolor': 'w', 'image.cmap': 'rocket', 'font.family': ['sans-serif'], 'font.sans-serif': ['DejaVu Sans', 'Liberation Sans', 'Bitstream Vera Sans', 'sans-serif'], 'xtick.bottom': True, 'xtick.top': False, 'ytick.left': True, 'ytick.right': False, 'axes.spines.left': True, 'axes.spines.bottom': True, 'axes.spines.right': False, 'axes.spines.top': False, 'xtick.minor.visible': False, 'ytick.minor.visible': False, 'legend.frameon': True, 'legend.facecolor': '0.9', 'legend.edgecolor': 'black', 'legend.shadow': False, 'legend.numpoints': 1, 'legend.scatterpoints': 1, 'legend.fontsize': 'medium', 'axes.titlesize': 'large', 'axes.labelsize': 'medium', 'xtick.labelsize': 'small', 'ytick.labelsize': 'small', 'axes.linewidth': 0.8, 'grid.linewidth': 0.8, 'lines.linewidth': 1.5, 'patch.linewidth': 1.0, 'xtick.major.size': 6.0, 'ytick.major.size': 6.0, 'xtick.minor.size': 4.0, 'ytick.minor.size': 4.0, 'xtick.major.width': 0.8, 'ytick.major.width': 0.8, 'xtick.minor.width': 0.6, 'ytick.minor.width': 0.6, 'axes3d.grid': True, 'axes3d.xaxis.panes_color': (0.95, 0.95, 0.95, 0.5), 'axes3d.yaxis.panes_color': (0.95, 0.95, 0.95, 0.5), 'axes3d.zaxis.panes_color': (0.95, 0.95, 0.95, 0.5), 'axes3d.xaxis.line_color': (0.2, 0.2, 0.2, 0.8), 'axes3d.yaxis.line_color': (0.2, 0.2, 0.2, 0.8), 'axes3d.zaxis.line_color': (0.2, 0.2, 0.2, 0.8), 'grid.alpha': 1.0}
定制风格参数:
我们可以通过修改 rc 字典中的键值对,来定制风格。例如,修改 darkgrid 风格的背景颜色为浅蓝色,网格线颜色为深灰色:
custom_style = { 'axes.facecolor': '#E0F7FA', # 浅蓝色背景 'grid.color': '#424242' # 深灰色网格线 } sns.set_style("darkgrid", rc=custom_style) plt.figure(figsize=(8, 6)) plt.plot(x, y1, label='曲线 1') plt.plot(x, y2, label='曲线 2') plt.title('定制 Darkgrid 风格示例') plt.xlabel('X轴') plt.ylabel('Y轴') plt.legend() plt.show()
常用可定制的风格参数:
axes.facecolor: 轴域背景颜色。
axes.edgecolor: 轴线颜色。
axes.grid: 是否显示网格线 (True/False)。
grid.color: 网格线颜色。
grid.linestyle: 网格线线型 (如 '-', '--', ':', '-.').
font.family: 字体族 (如 'sans-serif', 'serif', 'monospace').
font.sans-serif: 无衬线字体列表 (用于选择具体字体).
lines.linewidth: 线条粗细。
markers.size: 标记大小。
mermaid graph TD 图示:
with sns.axes_style()有时候,我们只需要在局部修改图形风格,而不是全局改变。Seaborn 提供了 with sns.axes_style() 上下文管理器,用于实现临时风格设置。
plt.figure(figsize=(12, 6)) # 第一个子图,应用默认风格 (假设全局风格为 darkgrid) plt.subplot(1, 2, 1) plt.plot(x, y1) plt.title('默认风格') # 第二个子图,应用临时定制风格 with sns.axes_style("whitegrid", rc={'axes.facecolor': '#F0F8FF'}): # 浅蓝色背景 plt.subplot(1, 2, 2) plt.plot(x, y2) plt.title('临时定制风格') plt.show()
代码详解:
with sns.axes_style("whitegrid", rc={'axes.facecolor': '#F0F8FF'}):: 使用 with 语句创建一个上下文环境,在该环境内部,图形风格被设置为 whitegrid,并进一步定制了背景颜色为浅蓝色。
在 with 语句块内部绘制的图形,将应用临时设置的风格。
with 语句块结束后,风格设置恢复到之前的状态(全局风格)。
mermaid graph TD 图示:
选择合适的图形风格,需要根据具体的应用场景和数据特点进行考虑。以下是一些选择风格的建议:
数据类型:
数值型数据: darkgrid, whitegrid, dark, white, ticks 风格都适用。可以根据数据量和精度需求选择是否需要网格线和刻度线。
类别型数据: darkgrid, whitegrid 风格在条形图、柱状图等类别型图表中表现良好,网格线可以辅助比较不同类别数值的大小。
展示场景:
正式报告/论文: white, ticks 风格更加专业、简洁,适合正式场合。
演示文稿/PPT: darkgrid, dark 风格更具视觉冲击力,更容易吸引观众注意力。
网页/App: whitegrid, white 风格更加清新、现代,符合网页和App的视觉风格。
个人偏好: 风格选择也带有一定的个人主观性。可以根据自己的审美偏好,选择最符合自己口味的风格。
通用建议:
保持一致性: 在一个报告或项目中,尽量保持图形风格的一致性,避免风格过于杂乱,影响专业性。
简洁为美: 在不影响信息传递的前提下,尽量选择简洁的风格,避免过度装饰,干扰数据解读。
突出数据: 风格的最终目的是为了更好地展示数据,选择能够突出数据特点,提升信息传递效率的风格才是最佳选择。
Seaborn 的图形风格 (Plot Styles) 是图形定制与美化的重要组成部分。通过 sns.set_style() 函数,我们可以快速切换预定义的五种内置风格 (darkgrid, whitegrid, dark, white, ticks),也可以通过 rc 参数进行更精细的定制。with sns.axes_style() 上下文管理器则提供了临时风格设置的功能。
理解和灵活运用 Seaborn 的图形风格,能够显著提升数据可视化的质量和效率,使图形更具吸引力、信息量和专业性。在实际应用中,应根据数据类型、展示场景和个人偏好,选择合适的风格,并不断探索和实践,打造更具个性化和美观的数据可视化作品。
希望本篇文章能够帮助读者深入理解 Seaborn 的图形风格,并在数据可视化实践中灵活运用,创造更出色的数据可视化成果。