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

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

1.构建数据图表的基础

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

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
import numpy as npdata = {'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 绘制三个柱状图。

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 来调整坐标轴的刻度、图表的标题以及图例的样式。

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 轴的参数传递。

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 中绘制聚类柱状图更加简便直接。

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 * 100labels = ["{: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 对图表的各个细节进行精细打磨。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/696576.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; class Solution {public int removeDuplicates(int[] nums) {int n nums.length;if (n < 2) {return n;}int slow 2, fast 2;while (fast < n) {if (nums[slow - 2] ! nums[fast]) {nums[slow] nums[fast];slow;}fast;}return sl…

ssm125四六级报名与成绩查询系统+jsp

四六级报名与成绩查询系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对四六级报名信息管理混乱&am…

防火墙远程桌面端口号修改,通过防火墙修改远程桌面的端口号详细操作步骤

使用防火墙修改远程桌面的端口号是一项涉及系统安全和网络配置的重要任务。 以下是详细的操作步骤&#xff0c;旨在确保您能够安全、有效地完成此操作&#xff1a; 一、准备阶段 1. 了解默认端口号&#xff1a;远程桌面端口号通常是3389&#xff0c;这是一个用于远程访问和控…

文件流-ASCII文件(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 编写程序实现以下功能&#xff1a;【要求处理ASCII文件】 &#xff08;1&#xff09;按职工号由小到大的顺序将5个员工的数据&#xff08;包括号码、姓名、年龄和工资&#xff09;输出到磁盘文件中保存&#xff1b; &#xff08;2&#xff…

基于SpringBoot + Vue的兼职网站管理系统设计与实现+毕业论文+答辩PPT

系统介绍 本系统包含管理员、用户、企业三个角色。 管理员角色&#xff1a;前台首页、个人中心、用户管理、企业管理、兼职信息管理、职位申请管理、留言板管理、系统管理。 用户角色&#xff1a;前台首页、个人中心、职位申请管理。 企业角色&#xff1a;前台首页、个人中心、…

【Nginx】如何在 Nginx 中阻止来自特定国家的 IP 地址访问

文章目录 前言一、准备工作二、查看 Nginx 服务器都拥有哪些模块2.1 先查看本地nginx是否有ngx_http_geoip2模块2.2 安装nginx并配置ngx_http_geoip2模块2.2.1下载所需版本的nginx到服务器2.2.2 先安装所需依赖2.2.3 解压文件2.2.4 下载ngx_http_geoip2模块2.2.5 编译安装nginx…

服务器3389端口,服务器3389端口风险提示的应对措施

3389端口是Windows操作系统中远程桌面协议&#xff08;RDP&#xff09;的默认端口。一旦该端口被恶意攻击者利用&#xff0c;可能会导致未经授权的远程访问和数据泄露等严重安全问题。 针对此风险&#xff0c;强烈建议您采取以下措施&#xff1a; 1. 修改默认端口&#xff1a;…

HarmonyOS开发案例:【生活健康app之获取成就】(3)

获取成就 本节将介绍成就页面。 功能概述 成就页面展示用户可以获取的所有勋章&#xff0c;当用户满足一定的条件时&#xff0c;将点亮本页面对应的勋章&#xff0c;没有得到的成就勋章处于熄灭状态。共有六种勋章&#xff0c;当用户连续完成任务打卡3天、7天、30天、50天、…

SpringCloud 集成 RocketMQ 及配置解析

文章目录 前言一、SpringCloud 集成 RocketMQ1. pom 依赖2. yml 配置3. 操作实体4. 生产消息4.1. 自动发送消息4.2. 手动发送消息 5. 消费消息 二、配置解析1. spring.cloud.stream.function.definition 前言 定义 Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力…

搜索引擎的设计与实现(二)

目录 3 搜索引擎的基本原理 3.1搜索引擎的基本组成及其功能 l.搜索器 (Crawler) 2.索引器(Indexer) 3.检索器(Searcher) 4.用户接口(UserInterface) 3.2搜索引擎的详细工作流程 4 系统分析与设计 4.1系统分析 4.2系统概要设计 4.2系统实现目标 前面内容请移步 搜索引…

使用编辑器代码给模型添加uLipSync组件

由于模型不停更改&#xff0c;需要频繁手动添加uLipSync组件&#xff0c;花时间写了编辑器代码去处理 using uLipSync; using UnityEditor; using UnityEditor.Events; using UnityEngine; using static uLipSync.uLipSyncBlendShape;/// <summary> /// 模型添加uLipSyn…

JavaEE之线程(4)——线程安全、线程安全的原因,synchronized关键字

前言 在本栏的前面的内容中&#xff0c;我们介绍了线程的创建、Thread 类及常见方法、线程的状态&#xff0c;今天我们来介绍一下关于线程的另一个重点知识——线程安全。 一、线程安全 基本概念&#xff1a; 线程安全的确切定义是复杂的&#xff0c;但我们可以这样认为&…