数据可视化宝典:Matplotlib图形实战

news2024/11/15 21:29:07

  在数据分析领域,图形化展示数据是非常重要的环节。Python中的matplotlib库是绘制各类图形的强大工具。本文将介绍如何使用matplotlib绘制折线图、直方图、饼图、散点图和柱状图等数据分析中常见的图形,并附上相应的代码示例,可以当初matplotlib函数库来使用,将案列中的数据替换成自己真实的数据即可绘制出符合条件的图像。
  关于matplotlib进行数据可视化的案列,具体参考Matplotlib 3.6.0 文档示例库,里面给出各种图形可视化的案列代码,具体如下所示:
在这里插入图片描述
  下面示点进去带标签的分组条形图页面下官方代码案列;
  此示例显示如何创建分组条形图以及如何使用标签注释条形图。
在这里插入图片描述
  接下来我们将详细介绍matplotlib在进行数据可视化分析过程常用的图像绘制;

一、折线图(Line Plot)

  折线图通常用于展示数据随时间或其他连续变量的变化趋势。

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 绘制折线图
plt.plot(x, y)

# 设置图表标题和坐标轴标签
plt.title('Sin Curve')
plt.xlabel('x')
plt.ylabel('y')

# 显示图表
plt.show()

在这里插入图片描述

二、直方图(Histogram)

  直方图用于展示数据的分布情况,特别是连续型变量的分布情况。

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
data = np.random.randn(1000)

# 绘制直方图
plt.hist(data, bins=30, edgecolor='black')

# 设置图表标题和坐标轴标签
plt.title('Histogram of Data')
plt.xlabel('Value')
plt.ylabel('Frequency')

# 显示图表
plt.show()

在这里插入图片描述

三、饼图(Pie Chart)

  饼图用于展示各类别的比例或占比。

import matplotlib.pyplot as plt

# 创建数据
labels = ['Category A', 'Category B', 'Category C']
sizes = [15, 30, 55]

# 绘制饼图
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)

# 设置图表标题
plt.title('Pie Chart Example')

# 显示图表
plt.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.
plt.show()

在这里插入图片描述

四、散点图(Scatter Plot)

  散点图用于展示两个变量之间的关系,通过点的分布来观察是否存在某种趋势或模式。

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
x = np.random.rand(50)
y = np.random.rand(50)

# 绘制散点图
plt.scatter(x, y)

# 设置图表标题和坐标轴标签
plt.title('Scatter Plot Example')
plt.xlabel('X')
plt.ylabel('Y')

# 显示图表
plt.show()

在这里插入图片描述

五、柱状图(Bar Chart)

  柱状图用于比较不同类别或不同时间点的数据大小。

import matplotlib.pyplot as plt

# 创建数据
categories = ['Category 1', 'Category 2', 'Category 3']
values = [10, 15, 7]

# 绘制柱状图
plt.bar(categories, values)

# 设置图表标题和坐标轴标签
plt.title('Bar Chart Example')
plt.xlabel('Categories')
plt.ylabel('Values')

# 显示图表
plt.show()

在这里插入图片描述

六、箱线图(Box Plot)

  箱线图用于展示一组数据的分布情况,包括最小值、下四分位数、中位数、上四分位数和最大值。

  下面是一个简单的示例,说明如何绘制箱线图,其中特征名称作为X轴的标签:

import matplotlib.pyplot as plt
import numpy as np

# 创建一些示例数据
np.random.seed(10)
data = {
    'Feature 1': np.random.normal(0, 1, 100),
    'Feature 2': np.random.normal(1, 1.5, 100),
    'Feature 3': np.random.normal(-1, 0.7, 100),
    'Feature 4': np.random.normal(2, 2, 100)
}

# 提取数据列表和特征名称列表
values = list(data.values())
labels = list(data.keys())

# 绘制箱线图
fig, ax = plt.subplots()
ax.boxplot(values, vert=True, patch_artist=True, labels=labels)

# 设置图表标题
ax.set_title('Box Plot with Features as X-axis Labels')

# 显示网格
ax.grid(True)

# 显示图表
plt.show()

在这里插入图片描述

  设置vert=True(这是默认值,表示箱体是垂直的),并启用patch_artist=True以允许我们为箱体设置颜色。最后,我们设置了图表的标题,并显示了网格和图表。

  要绘制水平分布的箱线图(即箱体的长轴沿X轴方向),你需要对matplotlibboxplot函数进行一些调整。特别地,你需要设置vert参数为False,这样箱线图就会水平显示。下面是一个简单的示例,说明如何创建水平箱线图:

import matplotlib.pyplot as plt
import numpy as np

# 创建一些示例数据
np.random.seed(10)
data = {
    'Feature 1': np.random.normal(0, 1, 100),
    'Feature 2': np.random.normal(1, 1.5, 100),
    'Feature 3': np.random.normal(-1, 0.7, 100),
    'Feature 4': np.random.normal(2, 2, 100)
}

# 提取数据为列表
values = [data[feature] for feature in data]

# 创建箱线图的位置(即X轴上的刻度位置)
positions = np.arange(len(data))

# 绘制水平箱线图
fig, ax = plt.subplots()
ax.boxplot(values, vert=False, patch_artist=True, positions=positions, notch=False)

# 设置箱线图的颜色
colors = ['b', 'g', 'r', 'c']
for patch, color in zip(ax.artists, colors):
    patch.set_facecolor(color)

# 设置X轴和Y轴的标签
ax.set_xlabel('Value')
ax.set_ylabel('Features')
ax.set_yticklabels(data.keys())  # 设置Y轴刻度标签为特征的名称

# 显示网格
ax.grid(True)

# 显示图表
plt.show()

在这里插入图片描述

七、箱线图
  面积图(Area Chart)结合了折线图和面积图的特性,可以展示随时间或其他连续变量的数据变化趋势,并且通过堆叠面积来表示多个类别的数据总量及其各自贡献。

  下面是一个简单的示例代码,演示如何使用matplotlib绘制折线面积图:

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# 绘制折线图和折线面积图
fig, ax = plt.subplots()
ax.plot(x, y1, label='sin(x)', color='blue', linewidth=2)
ax.plot(x, y2, label='cos(x)', color='red', linewidth=2)

# 绘制y1的面积图
ax.fill_between(x, y1, where=y1>=0, color='lightblue', interpolate=True)
ax.fill_between(x, y1, where=y1<0, color='blue', interpolate=True)

# 绘制y2的面积图,注意要调整y的起始值以避免重叠
ax.fill_between(x, y1+y2, where=(y1+y2)>=0, color='lightpink', interpolate=True)
ax.fill_between(x, y1+y2, where=(y1+y2)<0, color='pink', interpolate=True)

# 设置图表标题和坐标轴标签
ax.set_title('Stacked Line Area Chart Example')
ax.set_xlabel('x')
ax.set_ylabel('y')

# 添加图例
ax.legend()

# 显示网格
ax.grid(True)

# 显示图表
plt.show()

在这里插入图片描述

  在上面的代码中,我们首先定义了两个函数y1y2,它们分别代表sin(x)cos(x)的值。然后,我们使用plot函数绘制了这两个函数的折线图。接下来,我们使用fill_between函数来绘制每个函数的面积图。需要注意的是,为了避免面积图之间的重叠,我们在绘制y2的面积图时,将y的起始值调整为y1+y2

  最后,我们设置了图表的标题、坐标轴标签,并添加了图例。调用plt.show()函数来显示最终的折线面积图。

八、热力图

  为了更直观地绘制热力图,通常会使用seaborn库,它是基于matplotlib的一个更高级的统计绘图库。下面是一个使用seaborn绘制热力图的示例代码:

  首先,确保你已经安装了seaborn库。如果没有安装,可以使用pip进行安装:

pip install seaborn

  然后,你可以使用以下代码来绘制热力图:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# 创建一个随机数据矩阵
data = np.random.rand(10, 12)

# 创建一个热力图
heatmap = sns.heatmap(data, cmap='coolwarm', annot=True, fmt=".2f")

# 设置X轴和Y轴的标签
heatmap.set_xticklabels(range(1, 13))  # 设置X轴刻度标签
heatmap.set_yticklabels(range(1, 11))  # 设置Y轴刻度标签

# 设置图表的标题
plt.title('Heatmap Example')

# 显示图表
plt.show()

在这里插入图片描述

  在这个例子中,我们首先导入了所需的库,然后创建了一个10x12的随机数据矩阵。接着,我们使用sns.heatmap函数来绘制热力图,其中data参数是我们要展示的数据,cmap参数定义了颜色映射(这里使用了’coolwarm’),annot=True表示在每个格子中显示数据值,fmt=".2f"定义了数值的格式。最后,我们设置了X轴和Y轴的刻度标签,并为图表添加了标题。

  如果你坚持使用matplotlib而不使用seaborn,你也可以通过绘制一系列带颜色的矩形来手动创建热力图,但这将比使用seaborn更加复杂。因此,推荐使用seaborn来绘制热力图,因为它提供了更简洁、更高级的接口。

  后面将继续介绍seaborn绘图库;因为seaborn并是一个绘图库,它与DataFrame对象有很好的集成。

九、折线图多功能的封装图
  下面封装的ineChartPlotter类,是为绘制不同种类的折线图,有draw_line_chart、draw_line_ndims_one_dim和draw_nline_chart方法,具体的作用参看图片即可了解;

import matplotlib.pyplot as plt  
import pandas as pd  
import numpy as np

from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题

class LineChartPlotter:  
    def __init__(self):  
        self.fig = None  
        self.ax = None  
  
    def draw_line_chart(self, x, y, marker='o', label='工业', xlabel='Time', ylabel='Flow (累计进水流量)', title='南部污水厂累计进水流量(JSLL1/LJLL)'):  
        """在图上绘制一条折线图"""  
        self.fig, self.ax = plt.subplots()  
        self.ax.plot(x, y, marker=marker, label=label)  
        self.ax.set_xlabel(xlabel)  
        self.ax.set_ylabel(ylabel)  
        self.ax.legend()  
        self.ax.set_title(title)  
        self.ax.grid(True)  
        plt.show()  
  
    def draw_line_ndims_one_dim(self, data, xlabel='time', n=None, title='趋势对比图'):  
        """绘制一个n*1行的一个折线图,共用一个坐标轴"""  
        if n is None:  
            n = data.shape[1] - 1  
        self.fig, axs = plt.subplots(n, 1, figsize=(10, 15), sharex=True)  
        colors = plt.cm.viridis(np.linspace(0, 1, n))  
        for i, col in enumerate(data.columns[1:]):  
            if col != xlabel:  
                axs[i].plot(data[xlabel], data[col], color=colors[i], label=col)  
                axs[i].set_ylabel(f'({col})')  
                axs[i].legend()  
        axs[-1].set_xlabel('Time')  
        plt.tight_layout()  
        self.fig.suptitle(title)  
        plt.show()  
  
    def draw_nline_chart(self, data, xlabel='time', y_label='Flow', title='趋势对比图'):  
        """这一个图上绘制多个曲线的折线图"""  
        self.fig, self.ax = plt.subplots(figsize=(10, 5))  
        for column in data.columns[1:]:  
            self.ax.plot(data[xlabel], data[column], label=column)  
        self.ax.set_xlabel(xlabel)  
        self.ax.set_ylabel(y_label)  
        self.ax.set_title(title)  
        self.ax.legend()  
        max_flow = data[data.columns[1:]].max().max()  
        self.ax.set_ylim(0, max_flow)  
        self.ax.grid(True)  
        plt.show()  
    
# 使用示例  
if __name__ == "__main__":  
    # 假设我们有一个DataFrame,包含时间和多个流量序列  
    data = pd.DataFrame({  
        'time': pd.date_range(start='2023-01-01', periods=100, freq='D'),  
        'flow1': np.random.rand(100),  
        'flow2': np.random.rand(100),  
        'flow3': np.random.rand(100)  
    })  
  
    # 创建绘图对象  
    plotter = LineChartPlotter()  
  
    # 绘制单个折线图  
    # plotter.draw_line_chart(data['time'], data['flow1'], label='Flow 1')  
  
    # # 绘制多个子图的折线图  
    # plotter.draw_line_ndims_one_dim(data)  
  
    # # 绘制单个图上的多个折线图  
    # plotter.draw_nline_chart(data)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  总之matplotlib是Python中一个功能强大的数据可视化库,它提供了丰富的绘图接口,可以帮助用户快速创建各种高质量的图形,如折线图、直方图、饼图、散点图、柱状图等。以下是使用matplotlib进行数据可视化的几个关键总结和优势:

  • 多样化的图形支持:
      matplotlib支持绘制各种常见的统计图形,包括折线图、柱状图、散点图等,也支持更复杂的图形,如热力图、等高线图等。这使得matplotlib能够应对各种数据分析和可视化的需求。

  • 高度可定制性:
      matplotlib提供了大量的参数和选项,用户可以根据需要自定义图形的各个方面,包括颜色、线条样式、字体、图例等。这使得用户能够根据自己的需求和审美创建出独一无二的图形。

  • 易于集成:
      matplotlib可以与Python中的其他库(如NumPy、Pandas等)无缝集成,使得数据预处理、数据分析和数据可视化可以在同一个环境中进行。这大大提高了数据分析和可视化的效率。

  • 交互式图形:
      matplotlib支持创建交互式图形,用户可以通过鼠标和键盘与图形进行交互,如缩放、平移、选择数据点等。这使得用户能够更深入地探索和分析数据。

  • 丰富的文档和社区支持:
      matplotlib拥有完善的文档和活跃的社区支持,用户可以通过官方文档、教程、示例代码以及社区论坛等途径获取帮助和解答问题。这使得学习和使用matplotlib变得更加容易。

  • 高质量的输出:
      matplotlib可以生成高质量的图形输出,支持多种文件格式(如PNG、PDF、SVG等),可以满足不同场景下的需求。同时,matplotlib还支持在图形中嵌入LaTeX数学公式,使得图形更具专业性和可读性。

  • 跨平台兼容性:
      matplotlib具有良好的跨平台兼容性,可以在Windows、Linux和Mac OS等操作系统上运行。这使得用户可以在不同的平台上使用matplotlib进行数据可视化。

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

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

相关文章

mac如何打开exe文件?如何mac运行exe文件 如何在Mac上打开/修复/恢复DMG文件

在macOS系统中&#xff0c;无法直接运行Windows系统中的.exe文件&#xff0c;因为macOS和Windows使用的是不同的操作系统。然而&#xff0c;有时我们仍然需要运行.exe文件&#xff0c;比如某些软件只有Windows版本&#xff0c;或者我们需要在macOS系统中运行Windows程序。 虽然…

Python中的观察者模式及其应用

观察者模式是设计模式之一&#xff0c;实现一对多依赖&#xff0c;当主题状态变化时通知所有观察者更新。在Python中&#xff0c;通过自定义接口或内置模块实现观察者模式&#xff0c;可提高程序灵活性和扩展性&#xff0c;尤其适用于状态变化时触发操作的场景&#xff0c;如事…

JavaSE——算法(2/2):查找算法-二分查找(前言、详细图解、代码部分)

目录 前言 详细图解 代码部分 前言 查找算法中&#xff0c;首要讨论的是基本查找&#xff0c;也就是顺序查找&#xff0c;在数据量特别大的时候&#xff0c;基本查找这种从前往后挨个找的形式&#xff0c;性能是很差的&#xff01; 所以为了提高一些性能&#xff0c;产生了…

MyBatis中的#{} 和 ${}

目录 #{} 和 ${} 预编译 SQL 和 即时 SQL SQL注入 ${}的使用 #{} 和 ${}的使用 MyBatis参数赋值有两种方式&#xff0c;在上一篇文章中&#xff0c;一直使用 #{} 进行赋值&#xff0c;接下来&#xff0c;我们来使用 ${} 进行赋值&#xff0c;并观察 #{} 和 ${} 的区别 使用…

操作系统:线程

目录 前言&#xff1a; 1.线程 1.1.初识线程 1.2.“轻量化”进程 1.3.线程与进程 2.线程控制 2.1.pthread原生线程库 2.2.线程控制的接口 2.2.1.线程创建 2.2.线程退出|线程等待|线程分离|线程取消 2.3.pthread库的原理 2.4.语言和pthread库的关系 2.5.线程局部…

【leetcode】快慢指针相关题目总结

141. 环形链表 判断链表是否有环&#xff1a;如果链表中存在环&#xff0c;则在链表上不断前进的指针会一直在环里绕圈子&#xff0c;且不能知道链表是否有环。使用快慢指针&#xff0c;当链表中存在环时&#xff0c;两个指针最终会在环中相遇。 /*** Definition for singly-…

L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到一个处理错误。

一、首先这个问题&#xff0c;有一定概率出现&#xff08;已确认&#xff09; 1.使用后未将其断开或者频繁连接断开&#xff0c;导致注册表出现异常。&#xff08;目前推断是这样的&#xff09; 2.系统网卡驱动问题&#xff0c;需要进行网络重置&#xff0c;卸载网卡驱动后重新…

自动化机器学习——网格搜索法:寻找最佳超参数组合

自动化机器学习——网格搜索法&#xff1a;寻找最佳超参数组合 在机器学习中&#xff0c;选择合适的超参数是模型调优的关键步骤之一。然而&#xff0c;由于超参数的组合空间通常非常庞大&#xff0c;手动调整超参数往往是一项耗时且困难的任务。为了解决这个问题&#xff0c;…

基于Springboot的社区医疗服务系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的社区医疗服务系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

Unity LineRenderer 入门

概述&#xff1a; 如果你在你项目中需要一些渲染线条的效果&#xff0c;在3D场景中&#xff0c;渲染一个线条出来&#xff08;比如路线图&#xff0c;激光射线&#xff0c;标记点&#xff09;等效果&#xff0c;那这部分的学习一定不要错过喔。 Line Renderer&#xff08;线条…

ECHARTS学习

坐标轴 option {xAxis: {type: category,data: [A, B, C]},yAxis: {type: value},series: [{data: [120, 200, 150],type: line}] }; 1、坐标轴的默认类型type是数值型&#xff0c;而xAxis指定了类目型的data&#xff0c;所以Echarts也能识别出这是类目型的坐标轴&#xff0c;…

第八篇:隔离即力量:Python虚拟环境的终极指南

隔离即力量&#xff1a;Python虚拟环境的终极指南 1 引言 在编程的多元宇宙中&#xff0c;Python语言犹如一颗闪耀的星辰&#xff0c;其魅力不仅仅在于简洁的语法&#xff0c;更在于其庞大而繁荣的生态系统。然而&#xff0c;随着应用的增长和复杂性的提升&#xff0c;开发者们…

手搓带头双向循环链表(C语言)

目录 List.h List.c ListTest.c 测试示例 带头双向循环链表优劣分析 List.h #pragma once#include <stdio.h> #include <stdlib.h> #include <assert.h>typedef int LTDataType;typedef struct ListNode {struct ListNode* prev;struct ListNode* next…

上位机图像处理和嵌入式模块部署(树莓派4b读写json数据)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;ini文件是用来进行配置的&#xff0c;数据库是用来进行数据存储的。那json是用来做什么的呢&#xff0c;json一般是用来做…

[HNOI2003]激光炸弹

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二维前缀和板题。 注意从&#xff08;1,1&#xff09;开始存即可&#xff0c;所以每次输入x,y之后&#xff0c;要x,y。 因为m的范围最大为…

使用Neo4j和Langchain创建知识图谱

使用Neo4j和Langchain创建知识图谱 知识图谱是组织和整合信息的强大工具。通过使用实体作为节点和关系作为边缘&#xff0c;它们提供了一种系统的知识表示方法。这种有条理的表示有利于简化查询、分析和推理&#xff0c;使知识图在搜索引擎、推荐系统、自然语言处理和人工智能…

32.基础乐理-相对音感与绝对音感

相对音感的概念&#xff1a; 就是先给你一个音&#xff0c;告诉你这个音是X&#xff0c;然后再给一个Y音&#xff0c;你就能根据 X 音判断出这个 Y 音是什么&#xff0c;原理是在于你掌握的是 X 与 Y 之间相对距离的感觉&#xff0c;比如图1&#xff0c;弹两个键 先弹 小字一组…

Ubuntu GUI使用Root用户登录指南

Ubuntu GUI使用Root用户登录指南 一、前言 默认情况下&#xff0c;Ubuntu 禁用了 root 账户&#xff0c;我们必须使用 sudo 命令来执行任何需要 root 权限的任务&#xff0c;比如像这样删除一个系统配置文件&#xff08;操作危险&#xff0c;请勿尝试&#xff09;&#xff1a;…

python可视化学习笔记折线图问题-起始点问题

问题描述&#xff1a; 起始点的位置不对 from pyecharts.charts import Line import pyecharts.options as opts # 示例数据 x_data [1,2,3,4,5] y_data [1, 2, 3, 4, 5] # 创建 Line 图表 line Line() line.add_xaxis(x_data) line.add_yaxis("test", y_data) li…

安装“STM32F4 Discovery Board Programming with Embedded Coder”MATLAB获取硬件支持包失败

安装“STM32F4 Discovery Board Programming with Embedded Coder”MATLAB获取硬件支持包失败 -完美解决方法 显示请续订您的软件维护服务&#xff0c;解决办法 根据知乎的文章 MATLAB获取硬件支持包失败&#xff0c;显示请续订您的软件维护服务&#xff0c;解决办法&#xff…