Python中的数据可视化艺术:用Matplotlib和Seaborn讲故事

news2024/10/9 10:25:28

Python中的数据可视化艺术:用Matplotlib和Seaborn讲故事

数据可视化不仅仅是图表的绘制,更是通过视觉形式传达复杂信息的一种艺术。使用Python中的两个强大的库——Matplotlib和Seaborn,可以将数据转化为清晰、优美的图表,帮助我们更好地理解数据,甚至讲述一个数据驱动的故事。在这篇博客中,我们将探讨如何使用这两个库进行数据可视化,讲述数据背后的故事。
在这里插入图片描述

1. 数据可视化的重要性

在数据科学领域,数据可视化被认为是理解数据的重要工具。它不仅能帮助分析者发现隐藏的模式,还能让普通观众直观地理解数据的含义。通过不同的图表类型(例如散点图、条形图、箱线图等),我们可以针对不同类型的数据讲述不同的故事。
在这里插入图片描述

2. Matplotlib简介

Matplotlib是Python中最基础的绘图库之一,灵活且功能强大,几乎可以绘制任何类型的图表。它的API相对底层,意味着用户可以完全控制图表的各个方面。

2.1 Matplotlib安装

在开始使用之前,需要确保安装了Matplotlib。你可以通过pip命令进行安装:

pip install matplotlib

2.2 基础绘图示例

首先,我们来看一个简单的折线图示例:

import matplotlib.pyplot as plt

# 数据
years = [2015, 2016, 2017, 2018, 2019, 2020]
sales = [350, 410, 500, 590, 620, 710]

# 创建图表
plt.plot(years, sales, marker='o', linestyle='-', color='b')

# 添加标题和标签
plt.title('Yearly Sales')
plt.xlabel('Year')
plt.ylabel('Sales (in USD)')

# 显示图表
plt.show()

在这段代码中,我们定义了年份和销售额数据,并通过plt.plot函数绘制折线图。marker='o'表示在每个数据点上加上一个圆圈,而linestyle='-'则定义了线型为实线。

2.3 定制图表

Matplotlib的灵活性允许我们对图表进行高度定制,例如设置颜色、线条样式、添加图例和网格线等:

# 增加图表细节
plt.plot(years, sales, marker='o', linestyle='--', color='g', label='Sales')

# 添加网格线
plt.grid(True)

# 添加图例
plt.legend()

# 添加标题和标签
plt.title('Yearly Sales with Customizations')
plt.xlabel('Year')
plt.ylabel('Sales (in USD)')

plt.show()

2.4 使用子图

Matplotlib还可以通过subplot功能将多个图表展示在同一个窗口中:

# 创建子图
fig, axs = plt.subplots(2)

# 绘制第一个子图
axs[0].plot(years, sales, color='r')
axs[0].set_title('Sales Over Time')

# 绘制第二个子图
profit = [50, 60, 70, 80, 85, 100]
axs[1].bar(years, profit, color='b')
axs[1].set_title('Profit Over Time')

plt.tight_layout()
plt.show()

通过子图功能,你可以在一个窗口中呈现多个图表,便于对比和分析不同的数据集。
在这里插入图片描述

3. Seaborn简介

虽然Matplotlib功能强大,但在美观度和简洁性上有时稍显不足。Seaborn是基于Matplotlib构建的高级库,它提供了更为美观的默认图表,并且能够更方便地处理Pandas数据框数据。

3.1 Seaborn安装

安装Seaborn同样非常简单:

pip install seaborn

3.2 基础绘图示例

我们来看一个简单的Seaborn绘图示例——绘制散点图:

import seaborn as sns
import matplotlib.pyplot as plt

# 示例数据
tips = sns.load_dataset("tips")

# 使用seaborn绘制散点图
sns.scatterplot(x="total_bill", y="tip", data=tips)

# 添加标题
plt.title('Scatter Plot of Total Bill vs Tip')

plt.show()

在这个示例中,Seaborn使用了一个内置的“tips”数据集,并生成了总账单和小费之间的散点图。Seaborn的API设计非常简洁,自动处理了许多图表的美化细节。

3.3 主题和样式

Seaborn提供了多种内置的主题和样式,可以让图表看起来更加美观:

# 设置主题
sns.set_theme(style="darkgrid")

# 重新绘制散点图
sns.scatterplot(x="total_bill", y="tip", data=tips)
plt.title('Scatter Plot with Darkgrid Theme')

plt.show()

3.4 使用不同类型的图表

Seaborn非常适合绘制统计图表,以下是几个常见图表类型的示例:

  • 箱线图(Boxplot)
sns.boxplot(x="day", y="total_bill", data=tips)
plt.title('Boxplot of Total Bill by Day')
plt.show()
  • 直方图(Histogram)
sns.histplot(tips['total_bill'], bins=20)
plt.title('Histogram of Total Bill')
plt.show()
  • 热力图(Heatmap)
# 计算相关性矩阵
corr = tips.corr()

# 绘制热力图
sns.heatmap(corr, annot=True, cmap='coolwarm')
plt.title('Heatmap of Correlations')
plt.show()

3.5 可视化分布

Seaborn可以通过distplot等函数可视化数据的分布情况。例如,查看总账单的分布:

sns.histplot(tips['total_bill'], kde=True)
plt.title('Distribution of Total Bill with KDE')
plt.show()

3.6 组合图表

Seaborn的pairplot函数可以轻松创建数据集中不同变量之间的组合图表:

sns.pairplot(tips)
plt.show()

pairplot能自动生成数据集中各变量两两组合的散点图,并在对角线上绘制每个变量的分布图,从而全面了解数据的关系。
在这里插入图片描述

4. 讲述数据故事

通过Matplotlib和Seaborn,你可以使用多种图表来传达数据背后的故事。关键在于根据数据的特点选择合适的图表类型,并在必要时组合多个图表,来揭示更深层次的模式或趋势。

例如,你可以结合使用箱线图和散点图,来分析不同类别中的数据分布及异常值,或者使用热力图和相关性分析图,来揭示变量之间的关系。
在这里插入图片描述

5. 总结

数据可视化不仅是数据分析中的工具,更是一门艺术。通过Matplotlib和Seaborn,我们可以构建精美的图表,将复杂的数据转化为易于理解的信息,帮助我们更好地讲述数据背后的故事。在实际应用中,根据不同的数据特点和目标,选择合适的可视化方法,能让你的数据分析更有说服力。

掌握了这两种库,你不仅可以绘制各种统计图,还可以通过多种方式定制、优化图表,从而更好地传达信息。在未来的数据分析工作中,不妨多花点心思在图表的设计上,让你的数据可视化真正成为一门讲故事的艺术。
为了进一步提升这篇博客的深度,我们可以探讨更多的数据可视化实战技巧,特别是结合Matplotlib和Seaborn来解决一些现实中的问题和需求。通过实际案例和多样化的图表类型,你可以更好地理解如何利用这些工具讲述数据背后的故事。
在这里插入图片描述

6. 实战:股票数据的可视化

假设我们要分析一家公司的股票数据,例如从股票价格、成交量等角度展示其变化趋势。首先,我们可以通过Pandas读取股票数据,并结合Matplotlib和Seaborn进行可视化。

6.1 数据准备

在这个例子中,我们将使用Yahoo Finance提供的股票数据。可以通过yfinance库来获取:

pip install yfinance

接着,我们可以用下面的代码来抓取和可视化股票数据:

import yfinance as yf
import matplotlib.pyplot as plt
import seaborn as sns

# 下载股票数据
ticker = 'AAPL'
data = yf.download(ticker, start='2023-01-01', end='2023-10-01')

# 查看前几行数据
print(data.head())

# 绘制股票收盘价
plt.figure(figsize=(10, 6))
plt.plot(data.index, data['Close'], label=f'{ticker} Close Price')
plt.title(f'{ticker} Closing Price Over Time')
plt.xlabel('Date')
plt.ylabel('Price (USD)')
plt.grid(True)
plt.legend()
plt.show()

在这个实战中,我们下载了苹果公司(AAPL)的股票数据,绘制了其在2023年1月到2023年10月之间的收盘价走势。通过这样的可视化,投资者可以直观地看到股票价格的波动情况。

6.2 多图合并:价格与成交量

为了更全面地了解股票的走势,我们可以将价格和成交量放在同一个图中:

# 创建子图
fig, ax1 = plt.subplots(figsize=(10, 6))

# 绘制收盘价
ax1.set_xlabel('Date')
ax1.set_ylabel('Close Price (USD)', color='tab:blue')
ax1.plot(data.index, data['Close'], label='Close Price', color='tab:blue')
ax1.tick_params(axis='y', labelcolor='tab:blue')

# 创建另一个y轴用于成交量
ax2 = ax1.twinx()  
ax2.set_ylabel('Volume', color='tab:red')  
ax2.bar(data.index, data['Volume'], alpha=0.3, color='tab:red')
ax2.tick_params(axis='y', labelcolor='tab:red')

plt.title(f'{ticker} Closing Price and Volume')
plt.show()

在这段代码中,我们使用了双y轴(twinx())来同时展示收盘价和成交量。这样一来,观众可以通过一张图同时看到价格的波动和成交量的变化,帮助我们理解价格变化背后是否伴随着交易量的显著增长。

6.3 用Seaborn展示分布和相关性

接下来,我们可以进一步分析不同价格指标之间的关系,比如开盘价、收盘价、最高价和最低价。使用Seaborn绘制这些指标的相关性热力图:

# 计算相关性矩阵
corr_matrix = data[['Open', 'High', 'Low', 'Close']].corr()

# 绘制热力图
plt.figure(figsize=(8, 6))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', linewidths=0.5)
plt.title('Correlation Between Price Metrics')
plt.show()

通过相关性热力图,我们可以一目了然地看到这些价格指标之间的相关程度,帮助我们更好地理解股票市场的波动行为。

6.4 分析每日价格波动范围

股票市场中的波动性是投资者非常关心的指标之一。我们可以通过绘制每日的价格波动范围来分析股票的波动情况。

# 计算每日波动范围
data['Range'] = data['High'] - data['Low']

# 绘制波动范围的时间序列图
plt.figure(figsize=(10, 6))
plt.plot(data.index, data['Range'], label='Daily Price Range', color='orange')
plt.title(f'{ticker} Daily Price Range Over Time')
plt.xlabel('Date')
plt.ylabel('Range (USD)')
plt.grid(True)
plt.legend()
plt.show()

在这段代码中,我们计算了股票每日的最高价与最低价的差值,并将其可视化。通过这个图表,观众可以直观地看到某些时间点股票价格的波动变得更加剧烈,从而揭示市场动荡时期。
在这里插入图片描述

7. 实战:天气数据的可视化

接下来我们探讨另一个实际应用——天气数据的可视化。假设我们有一个城市的每日气温数据,想要展示这一年的温度变化。

7.1 数据准备

你可以用Pandas读取天气数据文件,然后进行可视化:

import pandas as pd

# 示例天气数据
data = pd.DataFrame({
    'Date': pd.date_range(start='2023-01-01', periods=365),
    'Temperature': np.random.normal(loc=20, scale=10, size=365)
})

# 转换日期格式
data['Date'] = pd.to_datetime(data['Date'])

# 绘制每日温度
plt.figure(figsize=(10, 6))
plt.plot(data['Date'], data['Temperature'], color='b', label='Temperature')
plt.title('Daily Temperature Over Time')
plt.xlabel('Date')
plt.ylabel('Temperature (°C)')
plt.grid(True)
plt.legend()
plt.show()

在这段代码中,我们随机生成了一年内的气温数据,并绘制了每日气温变化图。通过这个可视化,用户可以轻松看出气温的波动情况。

7.2 月度平均温度

为了更深入的分析,我们可以计算月度的平均温度,并通过条形图进行展示:

# 计算每月平均温度
data['Month'] = data['Date'].dt.month
monthly_avg_temp = data.groupby('Month')['Temperature'].mean()

# 绘制月度平均温度条形图
plt.figure(figsize=(10, 6))
sns.barplot(x=monthly_avg_temp.index, y=monthly_avg_temp.values, palette='Blues_d')
plt.title('Average Monthly Temperature')
plt.xlabel('Month')
plt.ylabel('Temperature (°C)')
plt.show()

在这段代码中,我们利用Seaborn的barplot绘制了月度平均温度的条形图,帮助观众快速了解每个月的气温变化趋势。

7.3 热力图展示气温分布

我们还可以通过热力图来展示全年气温的分布:

# 创建一个二维数组表示每个月每天的气温
pivot_data = data.pivot_table(values='Temperature', index=data['Date'].dt.day, columns=data['Date'].dt.month)

# 绘制热力图
plt.figure(figsize=(12, 8))
sns.heatmap(pivot_data, cmap='coolwarm', cbar=True)
plt.title('Heatmap of Daily Temperatures Throughout the Year')
plt.xlabel('Month')
plt.ylabel('Day')
plt.show()

在这个热力图中,每个格子表示一年中的某一天,其颜色代表当天的气温。通过这种可视化,我们可以很容易地发现全年气温的波动模式,例如炎热的夏季和寒冷的冬季。
在这里插入图片描述

8. 实战:可视化数据趋势和异常值

在某些场景下,我们不仅需要展示数据,还要发现数据中的趋势和异常值。例如,检测某些时段的异常波动,或者分析某个变量随时间的趋势变化。

8.1 识别趋势和异常

我们可以使用滚动平均线和上下限来展示趋势和异常值:

# 计算滚动平均和标准差
data['RollingMean'] = data['Temperature'].rolling(window=7).mean()
data['UpperBound'] = data['RollingMean'] + 2 * data['Temperature'].rolling(window=7).std()
data['LowerBound'] = data['RollingMean'] - 2 * data['Temperature'].rolling(window=7).std()

# 绘制温度和趋势
plt.figure(figsize=(10, 6))
plt.plot(data['Date'], data['Temperature'], label='Daily Temperature', alpha=0.5)
plt.plot(data['Date'], data['RollingMean'], color='r', label='Rolling Mean')
plt.fill_between(data['Date'], data['UpperBound'], data['LowerBound'], color='gray', alpha=0.3, label='Normal Range')
plt.title('Temperature Trends and Anomalies')
plt.xlabel('Date')
plt.ylabel('Temperature (°C)')
plt.legend()
plt.show()

在这个可视化中,我们展示了每日气温的滚动平均线,并使用标准差定义了一个正常范围。这样,任何超出上下限的点都可以被认为是异常值,帮助我们识别数据中的异常模式。
在这里插入图片描述

9. 总结

在实际项目中,数据可视化不仅仅是展示数据的手段,更是通过图形化展示帮助我们更好地理解数据、发现模式和趋势、分析关联性、识别异常值等重要任务的关键工具。Matplotlib和Seaborn作为Python中最流行的数据可视化库,提供了丰富的功能和灵活的绘图选项,能够满足从简单到复杂的可视化需求。通过本文的实战案例,希望能够帮助你更好地掌握这些工具,为数据科学和分析工作提供更强有力的支持。

这篇博客总结了从基础到高级的数据可视化技术,帮助你用Matplotlib和Seaborn讲述数据的故事,展示数据的复杂关系和趋势变化。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

理解计算机系统_程序的机器级表示(二):寄存器,操作数,数据传送,程序栈

前言 以<深入理解计算机系统>(以下称“本书”)内容为基础&#xff0c;对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定 引入 本书第三章&#xff1a;程序的机器级表示内容的理解,这一章内容以汇…

智能电子价签:助力零售效率升级的关键

在竞争日益激烈的零售市场&#xff0c;如何优化运营、提升效率&#xff0c;是每个零售商都在关注的问题。电子价签作为一项创新技术&#xff0c;提供了蒿效的解决方案。今天&#xff0c;我们就来聊聊电子价签如何帮助零售商轻松管理信息、减少人工误差&#xff0c;并展示它在门…

【AI绘画】Midjourney进阶:对称构图详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;什么是构图为什么Midjourney要使用构图 &#x1f4af;对称构图特点使用场景提示词书写技巧测试 &#x1f4af;小结 &#x1f4af;前言 通常来学习AI绘画的人可以分为…

遥感影像-语义分割数据集:多源多模态地物多要素数据集详细介绍及训练样本处理流程

原始数据集详情 简介&#xff1a;该数据集由WHU-OPT-SAR数据集整理而来&#xff0c;覆盖面积51448.56公里&#xff0c;分辨率为5米。据我们所知&#xff0c;WHU-OPT-SAR是第一个也是最大的土地利用分类数据集&#xff0c;它融合了高分辨率光学和SAR图像&#xff0c;并进行了充…

非酒精性脂肪性肝炎NASH临床赛道的百米冲刺,谁将成为胜者?

前 言 非酒精性脂肪性肝炎&#xff08;NASH&#xff09;是一种与肥胖、血脂异常、2型糖尿病和代谢综合征密切相关的疾病&#xff0c;可能会发展为肝硬化、终末期肝病甚至肝癌。据美国肝脏基金会统计数据显示&#xff0c;截至2023年8月&#xff0c;美国成年人中有5%的NASH患者…

使用 YOLOv 11 模型实现实时手语检测 可同时识别多个手语手势

项目&#xff1a;Yolo11 - Roboflow - OpenCV 手语是聋哑人之间以及他们与外界沟通的重要工具&#xff0c;然而&#xff0c;许多不会手语的人无法与他们有效交流。这个项目的目标是通过自动检测手语手势&#xff0c;构建一个可以帮助聋哑人和普通人之间沟通的桥梁&#xff0c;…

立体扬声器棒球帽专利TRO维权,速查避免踩坑

案件基本情况起诉时间&#xff1a;2024-9-18案件号&#xff1a;24-cv-08626原告&#xff1a;Audiowear Technology Corporation原告律所&#xff1a;Loza & Loza, LLP起诉地&#xff1a;伊利诺伊州北部法院品牌介绍Audiowear Technology Corporation&#xff0c;一家位于特…

麒麟V10系统下的调试工具(网络和串口调试助手)

麒麟V10系统下的调试工具&#xff08;网络和串口调试助手&#xff09; 1.安装网络调试助手mnetassist arm64-main ①在linux下新建一个文件夹 mkdir /home/${USER}/NetAssist②将mnetassist arm64-main.zip拷贝到上面文件夹中&#xff0c;并解压给权限 cd /home/${USER}/Ne…

(23)DBPSK信号在Rayleigh衰落信道条件下的传输性能仿真

文章目录 前言一、MATLAB仿真代码二、仿真结果画图 前言 此示例创建了一个【频率平坦的瑞利衰落信道】对象&#xff0c;并使用该对象来对DBPSK信号进行衰落处理&#xff0c;衰落之后增加了不同信噪比的AWGN&#xff0c;计算出不同的信噪比值计算误码率&#xff0c;并和理论误码…

八、索引的创建与设计原则

文章目录 1. 索引的声明与使用1.1 索引的分类1.2 创建索引1.2.1 在创建表时创建索引1.2.2 在已经存在的表上创建索引1.3 删除索引2. MySQL8.0索引新特性2.1 支持降序索引2.2 隐藏索引3. 索引的设计原则3.1 数据准备3.2 哪些情况适合创建索引3.2.1 字段的数值有唯一性的限制3.2.…

Cisco Catalyst 9000 交换产品系列 IOS XE 17.15.1 发布下载,新增功能概览

Cisco Catalyst 9000 Series Switches, IOS XE Release 17.15.1 ED 思科 Catalyst 9000 交换产品系列 IOS XE 系统软件 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-catalyst-9000/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&…

Google:敏感信息访问权限和 API 政策更新

目录 公布时间公布内容内容有关 Google Play 照片和视频权限政策的详细信息截止时间相关问题公布时间 公布日期:2023-10-25 公布内容 内容 为向用户提供更注重隐私保护的体验,我们将推出“照片和视频访问权限”政策,以减少获准针对照片/视频请求广泛权限(READ_MEDIA_IM…

探索 ACM:计算机领域的卓越组织

《探索 ACM&#xff1a;计算机领域的卓越组织》 在计算机科学的广袤星空中&#xff0c;ACM&#xff08;Association for Computing Machinery&#xff0c;美国计算机协会&#xff09;犹如一颗璀璨的巨星&#xff0c;散发着耀眼的光芒。 ACM 是世界上最大的计算机领域专业性学…

从给定的序列中随机抽取一个元素secrets.choice()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 从给定的序列中随机抽取一个元素 secrets.choice() [太阳]选择题 根据给定的Python代码&#xff0c;哪个选项是不可能输出的&#xff1f; import secrets sequence ["red", &qu…

PCL 法线空间下采样滤波

目录 一、概述二、代码三、结果 一、概述 对于原始点云&#xff0c;通过其点云法向量进行下采样&#xff0c;在法向量变化大的地方采样密度大&#xff0c;在法向量变化小的地方&#xff0c;采样密度小。 计算点云的空间法向量。依次计算相邻点之间的法向量夹角&#xff0c;以此…

Node.js管理工具NVM

nvm&#xff08;Node Version Manager&#xff09;是一个用于管理多个 Node.js 版本的工具。以下是 nvm 的使用方法和一些常见命令&#xff1a; 一、安装 nvm 下载 nvm&#xff1a; 地址&#xff1a;https://github.com/coreybutler/nvm-windows/releases访问 nvm 的 GitHub 仓…

Autodesk Flame 2025:视觉特效制作解决方案

Autodesk Flame 2025是一款功能强大的视觉特效制作解决方案&#xff0c;由Autodesk公司开发。它提供了出色的性能&#xff0c;为视觉特效艺术家成功完成制作项目提供了所需的交互性和灵活性。 以下是Autodesk Flame 2025的一些主要特点和功能&#xff1a; 高效的三维合成环境&…

C语言 | Leetcode C语言题解之第464题我能赢吗

题目&#xff1a; 题解&#xff1a; typedef struct HashItem {int key;bool val;UT_hash_handle hh; } HashItem;bool dfs(int maxChoosableInteger, int usedNumbers, int desiredTotal, int currentTotal, HashItem **memo) {HashItem *pEntry NULL;HASH_FIND_INT(*memo, …

C# 图像平移

图像平移&#xff1a;图像的平移是将一幅图像上的所有点都按照给定的偏移量在水平方向沿x轴、在垂直方向上沿y轴移动&#xff0c;平移后的图像与原图像大小相同。设(x0,y0) 为原图像上的一点&#xff0c;图像水平平移量为△x&#xff0c;垂直平移量为△y&#xff0c;则平移后点…

什么是词嵌入(Word Embedding)

1. 什么是词嵌入(Word Embedding) ⾃然语⾔是⼀套⽤来表达含义的复杂系统。在这套系统中&#xff0c;词是表义的基本单元。顾名思义&#xff0c;词向量是⽤来表⽰词的向量&#xff0c;也可被认为是词的特征向量或表征。把词映射为实数域向量的技术也叫词嵌⼊&#xff08;word e…