3款常用的可视化工具Matplotlib、Seaborn和Pandas

大家好,Seaborn 是基于 Matplotlib 的扩展库,Pandas 的可视化功能同样也依赖于 Matplotlib。尽管二者都使用相同的底层图形库,但绘制图表的方法却各有千秋。本文将介绍各种柱状图的绘制,比较 Matplotlib、Pandas 和 Seaborn 在数据可视化方面的功能、优势和局限。

1.构建数据图表的基础

先从定义一些虚拟数据和导入所需库开始:

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
import numpy as np

data = {
    'label': ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X'],
    'percent': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
    'remaining': [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0],
}

df = pd.DataFrame(data)

创建一个包含三个子图的 Matplotlib 图形,然后分别用 Matplotlib、Pandas 和 Seaborn 绘制三个柱状图。

python 复制代码
f, (ax1, ax2, ax3) = plt.subplots(3, figsize=(12, 8))  # matplotlib
ax1.bar(df.label, df.percent)  # pandas
df.plot(x='label', y='percent', kind='bar', ax=ax2)  # seaborn
sb.barplot(x=df.label, y=df.percent, ax=ax3)
plt.show()

虽然绘制的图表在外观上各具特色,采用的生成方法也不尽相同,但它们背后都是由 Matplotlib 的对象构成的,编辑图表的方式方法是一致的。

2.定制化图表设计

绘制好柱状图后,就可以通过与坐标轴、图形以及其他元素的交互来对图表进行个性化定制。

具体来说,既可以利用 Seaborn 提供的函数来进行快速定制,也可以深入到 Matplotlib 的对象层面进行精细调整。Pandas 在简化绘图流程方面有其独到之处,但它主要负责图表的生成,而不提供直接编辑 Matplotlib 对象的功能。

接下来,对图表进行一系列的修改。首先,设置统一的主题风格。然后,利用 Seaborn 的功能去除图上的脊线,并添加必要的标签。最后,通过 Matplotlib 来调整坐标轴的刻度、图表的标题以及图例的样式。

python 复制代码
sb.set_theme(style="whitegrid")
f, (ax1, ax2, ax3) = plt.subplots(3, figsize=(10, 16))

ax1.bar(df.label, df.percent)
df.plot(x='label', y='percent', kind='bar', ax=ax2)
sb.barplot(x=df.label, y=df.percent, ax=ax3)

sb.despine(f)
for ax in [ax1, ax2, ax3]:
    container = ax.containers[0]
    labels = ["{:g}%".format(val * 100) for val in container.datavalues]
    ax.bar_label(container, labels=labels)
    ax.grid(False)
    ax.grid(axis='y')
    ticks = np.arange(0, 1.1, 0.1)
    tick_labels = ["{:g}%".format(val) for val in ticks]
    ax.set_yticks(ticks, tick_labels)
    ax.legend([])
    ax.get_legend().remove()
    ax.set_ylabel('Y 轴')
    ax.set_xlabel('X 轴')
    ax.set_title('你好,世界', fontsize=16)
plt.show()

3.横向柱状图

要在 Matplotlib 中实现柱状图 90 度旋转,需要将方法.bar 更改为.barh

对于 Seaborn,如果 X 轴是数值字段且 Y 轴代表字符串字段,那么会自动绘制横向柱状图。若 X 和 Y 轴均为数值字段,则可以通过设置参数orient='h' 来强制图表以水平方式展示。

至于 Pandas,虽然初看之下令人有些困惑,但实际操作起来并不复杂。只需要将绘图类型的参数kind改为 "barh"就行。需要注意的是,在这种情况下,X 轴和 Y 轴的参数是相反的,因此即便标签显示在 Y 轴上,也需要将其作为 X 轴的参数传递。

python 复制代码
f, (ax1, ax2, ax3) = plt.subplots(3, figsize=(10, 12))
ax1.barh(df.label, df.percent)

df.plot(x='label', y='percent', kind='barh', ax=ax2)

sb.barplot(data=df, x='percent', y='label', orient='h', ax=ax3)
sb.despine(f)

for ax in [ax1, ax2, ax3]:
    container = ax.containers[0]
    labels = ["{:g}%".format(val * 100) for val in container.datavalues]
    ax.bar_label(container, labels=labels)
    ax.grid(False)
    ax.grid(axis='x')
    ticks = np.arange(0, 1.1, 0.1)
    tick_labels = ["{:g}%".format(val) for val in ticks]
    ax.set_xticks(ticks, tick_labels)
    ax.legend([])
    ax.get_legend().remove()
    ax.set_ylabel('Y 轴')
    ax.set_xlabel('X 轴')
    ax.set_title('你好,世界', fontsize=16)

plt.tight_layout()
plt.show()

4.分组/聚类柱状图

Seaborn 为 Matplotlib 增添了许多强大的功能,Pandas 也提供了简化数据可视化的方法。

使用 Matplotlib 绘制聚类柱状图时,需要确保 X 轴是数值类型,以便于调整柱状的具体位置,同时,通常还需要对每组柱状应用.bar函数。

相较之下,在 Seaborn 和 Pandas 中绘制聚类柱状图更加简便直接。

python 复制代码
f, (ax1, ax2, ax3) = plt.subplots(3, figsize=(12, 8))

x = np.arange(0, len(df.label))
ax1.bar(x - 0.3, df.percent, width=0.3)
ax1.bar(df.label, df.remaining, width=0.3)

df.plot(x='label', y=['percent', 'remaining'], kind='bar', ax=ax2)

df2 = df.melt(id_vars=['label'], value_vars=['percent', 'remaining'])
sb.barplot(data=df2, x='label', y='value', hue='variable', ax=ax3)

sb.despine(f)

for ax in [ax1, ax2, ax3]:
    for container in ax.containers:
        values = container.datavalues * 100
        labels = ["{:g}%".format(val) for val in values]
        ax.bar_label(container, labels=labels)
    ax.grid(False)
    ax.grid(axis='y')
    ticks = np.arange(0, 1.1, 0.1)
    tick_labels = ["{:g}%".format(val * 100) for val in ticks]
    ax.set_yticks(ticks, tick_labels)
    ax.legend([])
    ax.get_legend().remove()
    ax.set_ylabel('Y 轴')
    ax.set_xlabel('X 轴')
    ax.set_title('你好,世界', fontsize=16)

plt.show()

Pandas 提供了便利,支持通过传递 Y 轴字段的列表来自动绘制聚类柱状图,此时,每个柱状组对应一列数据。

而在 Seaborn 中,可以通过定义 Hue 来控制数据的分组和着色方式。为了实现这一点,需要两列数据:一列用于区分所有的值,另一列则用于指定柱状的类别或组。在上面的例子中,需要对 DataFrame 进行重塑,以适配 Seaborn 的绘图要求。

Seaborn 在美化图表方面表现非常出色,提供的易于使用的函数和多样化的图表类型,为数据可视化增添了许多价值。Pandas 在快速生成图表方面也毫不逊色。无需额外库的辅助,就能够用极简的代码快速生成美观的图表。不过无论是 Seaborn 还是 Pandas,二者都基于 Matplotlib 构建。因此,只要对 Matplotlib 的架构和对象有深刻理解,就能够轻松地定制图表。

此外,可以巧妙地结合这三个库的优势,共同完成可视化任务。可以首先使用 Pandas 快速生成图表框架,然后通过 Seaborn 应用美观的主题样式,最后利用 Matplotlib 对图表的各个细节进行精细打磨。

相关推荐
叫我:松哥2 小时前
基于Flask的心理健康咨询管理与智能分析,集成AI智能对话咨询、心理测评(PHQ-9抑郁量表/GAD-7焦虑量表)、情绪追踪记录、危机预警识别
大数据·人工智能·python·机器学习·信息可视化·数据分析·flask
q_35488851532 小时前
交通数据分析项目:python地铁数据可视化分析系统 Flask框架 爬虫 数据分析 轨道数据 地铁数据分析 大数据 (源码)✅
人工智能·爬虫·python·机器学习·信息可视化·数据分析·flask
Access开发易登软件20 小时前
数据处理中的两大基石:何时选择Excel,何时考虑Access
数据库·信息可视化·excel·vba·access
静听松涛13321 小时前
门诊患者分诊引导流程图设计模板
大数据·论文阅读·人工智能·信息可视化·流程图·健康医疗
GIS之路1 天前
GDAL 实现影像合并
前端·python·信息可视化
人工干智能1 天前
你知道 Pandas 中 `pd.get_dummies()` 会生成哪些独热的新列么?
大数据·pandas
Guheyunyi1 天前
智能巡检:技术融合与系统生成
大数据·人工智能·科技·安全·信息可视化
叫我:松哥1 天前
基于YOLO的图像识别系统,结合Flask、Bootstrap和SQLite,提供图像检测、数据管理和用户交互功能,可以检测80个类别
人工智能·python·yolo·信息可视化·sqlite·flask·bootstrap
叫我辉哥e11 天前
新手进阶Python:办公看板集成审批流+精细化权限+日志审计
开发语言·python·信息可视化
CodeCraft Studio1 天前
【能源行业案例】借助LightningChart打造高性能工业级数据可视化能力
信息可视化·lightningchart·能源数据可视化·js图表组件·web图表库·高性能图表