Matplotlib数据可视化入门

本文其实属于:Python的进阶之道【AIoT阶段一】的一部分内容,本篇把这部分内容单独截取出来,方便大家的观看,本文介绍 Matplotlib数据可视化,后续还会单独发一篇Matplotlib数据可视化高级以及Matplotlib数据可视化进阶内容供读者学习。在数据分析与机器学习中,我们经常要用到大量的可视化操作。一张制作精美的数据图片,可以展示大量的信息,一图顶千言。而在可视化中,Matplotlib算得上是最常用的工具。Matplotlib 是 python 最著名的绘图库,它提供了一整套 API,十

前言

本文其实属于:Python的进阶之道【AIoT阶段一】的一部分内容,本篇把这部分内容单独截取出来,方便大家的观看,本文介绍Matplotlib数据可视化入门,后续还会单独发一篇Matplotlib数据可视化高级以及Matplotlib数据可视化进阶内容供读者学习。

在数据分析与机器学习中,我们经常要用到大量的可视化操作。一张制作精美的数据图片,可以展示大量的信息,一图顶千言。
Matplotlib数据可视化入门
而在可视化中,Matplotlib算得上是最常用的工具。Matplotlib 是 python 最著名的绘图库,它提供了一整套 API,十分适合绘制图表,或修改图表的一些属性,如字体、标签、范围等。
Matplotlib数据可视化入门
Matplotlib 是一个 Python 的 2D 绘图库,它交互式环境生成出版质量级别的图形。通过 Matplotlib这个标准类库,开发者只需要几行代码就可以实现生成绘图,折线图、散点图、柱状图、饼图、直方图、组合图等数据分析可视化图表。
Matplotlib数据可视化入门
🌟 学习本文之前,需要先自修:NumPy从入门到进阶pandas从入门到进阶本文中很多的操作在 NumPy从入门到进阶pandas从入门到进阶二文中有详细的介绍,包含一些软件以及扩展库,图片的安装和下载流程,本文会直接进行使用。

下载 Matplotlib数据可视化入门 见博客:matplotlib的安装教程以及简单调用,这里不再赘述

1.基础知识

1.1 图形绘制

🚩数据可视化其实就是把抽象不容易看出规律的数据转换为人眼更能接受的图片,下面我们来简单的绘制一个图形

import numpy as np
import matplotlib.pyplot as plt

# 横坐标
# 等差数列,把[0,2π]等分成100份
x = np.linspace(0, 2 * np.pi, 100)

# 纵坐标:正弦波; x:Numpy数组
y = np.sin(x)

# 画线形图
plt.plot(x, y)

Matplotlib数据可视化入门
接下来我们对这个图进行简单的参数设置:

# 设置横坐标的范围是 -1 ~ 10
plt.xlim(-1, 10)

# 设置纵坐标的范围是 -1.5 ~ 1.5
plt.ylim(-1.5, 1.5)

# 设置网格线,网格线颜色设为绿色,透明度为0.5,线的样式为虚线:--,宽度为2
plt.grid(color = 'green', alpha = 0.5, linestyle = '--', linewidth = 2)

plt.plot(x, y)

Matplotlib数据可视化入门

1.2 标题、标签、坐标轴刻度

1.2.1 标题的设置

🚩标题其实就是图片的名字,即这个图片是什么,表达的是什么样的含义

# 数据还是刚刚绘制的正弦图
plt.plot(x, y)

# 图的标题设置为 Sin(x),字体大小设为18,颜色设为红色,标题离图片的间距为20
plt.title('Sin(x)', fontsize = 18, color = 'red', pad = 20)

Matplotlib数据可视化入门
那么我们是否可以把标题设置为中文呢?

# 数据还是刚刚绘制的正弦图
plt.plot(x, y)

# 图的标题设置为正弦波,字体大小设为18,颜色设为红色,标题离图片的间距为20
plt.title('正弦波', fontsize = 18, color = 'red', pad = 20)

Matplotlib数据可视化入门
WTF??? 居然乱码报错了,下面我们来介绍解决的方法:

首先先来查看一下我们电脑都有哪些字体:

# 找到电脑的字体
from matplotlib import font_manager
fm = font_manager.FontManager()
# 用列表生成式获取字体
[font.name for font in fm.ttflist]

Matplotlib数据可视化入门

我们的电脑有很多的字体,这个截图只展示了一部分字体,其中有英文字体,中文字体…

我们可以找找有没有 Matplotlib数据可视化入门(楷体)
浏览器页面搜索(Google浏览器),按下 Ctrl + F,输入 KaiTi:
Matplotlib数据可视化入门
或者你搜宋体什么的都是可以的,一般电脑都会有这些字体,接下来回到我们的报错代码上,我们来设置我们的字体:

# 数据还是刚刚绘制的正弦图
plt.plot(x, y)

# 设置字体为楷体
plt.rcParams['font.family'] = 'KaiTi'

# 图的标题设置为正弦波,字体大小设为18,颜色设为红色,标题离图片的间距为20
plt.title('正弦波', fontsize = 18, color = 'red', pad = 20)

Matplotlib数据可视化入门
这下 正弦波 被显示出来了,可是还是有报错,这波啊~,这波叫做对了但没完全对,我们通过观察图像可以发现是负号有出了问题:
Matplotlib数据可视化入门
害,多大点事儿嘛,有 bug 咋们就接着改就完了:

# 数据还是刚刚绘制的正弦图
plt.plot(x, y)

# 设置字体为楷体
plt.rcParams['font.family'] = 'KaiTi'

# 设置数字的负号
plt.rcParams['axes.unicode_minus'] = False

# 图的标题设置为正弦波,字体大小设为18,颜色设为红色,标题离图片的间距为20
plt.title('正弦波', fontsize = 18, color = 'red', pad = 20)

Matplotlib数据可视化入门
ok,这下所有的 bug 就完美的解决了,但是总看的不得劲,字体有点小了,看起来费眼睛,我们来把所有的字体都变得大一点:

# 数据还是刚刚绘制的正弦图
plt.plot(x, y)

# 设置字体为楷体
plt.rcParams['font.family'] = 'KaiTi'

# 设置数字的负号
plt.rcParams['axes.unicode_minus'] = False

# 把所有的字体都设置成 28 大小
plt.rcParams['font.size'] = 28

# 图的标题设置为正弦波,字体大小设为18,颜色设为红色,标题离图片的间距为20
plt.title('正弦波', fontsize = 18, color = 'red', pad = 20)

Matplotlib数据可视化入门
好家伙,又出问题了,我们的字体虽然都变大了(图片显示的不明显,读者自己执行一下代码会有明显的变化),但是相对应的我们的图变小了,我们来设置一下图片的尺寸:

# 设置图片的大小
plt.figure(figsize = (12, 9))

# 数据还是刚刚绘制的正弦图
plt.plot(x, y)

# 设置字体为楷体
plt.rcParams['font.family'] = 'KaiTi'

# 设置数字的负号
plt.rcParams['axes.unicode_minus'] = False

# 把所有的字体都设置成 28 大小
plt.rcParams['font.size'] = 28

# 图的标题设置为正弦波,字体大小设为18,颜色设为红色,标题离图片的间距为20
plt.title('正弦波', fontsize = 18, color = 'red', pad = 20)

Matplotlib数据可视化入门

1.2.2 标签的设置

🚩标签对应到我们的上图之中其实就是横纵坐标

plt.figure(figsize = (9, 6))
plt.plot(x, y)
plt.rcParams['font.family'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 28
plt.title('正弦波', fontsize = 18, color = 'red', pad = 20)

# 设置横坐标为 X
plt.xlabel('X')
# 设置纵坐标为 f(x) = sin(x)
plt.ylabel('f(x) = sin(x)')

Matplotlib数据可视化入门
看着纵坐标竖着不舒服,我们把它横过来:

plt.figure(figsize = (9, 6))
plt.plot(x, y)
plt.rcParams['font.family'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 28
plt.title('正弦波', fontsize = 18, color = 'red', pad = 20)

# 设置横坐标为 X
plt.xlabel('X')
# 设置纵坐标为 f(x) = sin(x)
plt.ylabel('f(x) = sin(x)', rotation = 0)

Matplotlib数据可视化入门
纵坐标离 Matplotlib数据可视化入门轴有点近,我们继续调整一下:

plt.figure(figsize = (9, 6))
plt.plot(x, y)
plt.rcParams['font.family'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 28
plt.title('正弦波', fontsize = 18, color = 'red', pad = 20)

# 设置横坐标为 X
plt.xlabel('X')
# 设置纵坐标为 f(x) = sin(x)
plt.ylabel('f(x) = sin(x)', rotation = 0, horizontalalignment = 'right')

Matplotlib数据可视化入门

1.2.3 坐标轴刻度的设置

🚩接下来我们设置刻度,上图中的 0 2 4 6 -1.0 -0.5 0.0 0.5 1.0 其实就是刻度,因为我们现在描绘的是正弦波,对于正弦波而言,我们Matplotlib数据可视化入门轴上的刻度其实给-1 0 1就可以了:
Matplotlib数据可视化入门
我们的横坐标刻度对于正弦波而言一般是 Matplotlib数据可视化入门

plt.figure(figsize = (9, 6))
plt.plot(x, y)
plt.rcParams['font.family'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 28
plt.title('正弦波', fontsize = 18, color = 'red', pad = 20)
plt.xlabel('X')
plt.ylabel('f(x) = sin(x)', rotation = 0, horizontalalignment = 'right')

# 设置y轴上的刻度为:-1 0 1
plt.yticks([-1, 0, 1])
# 设置x轴的刻度
plt.xticks([0, np.pi / 2, np.pi, 1.5 * np.pi, 2 * np.pi])

Matplotlib数据可视化入门
这好像和我们希望的不太一样,这编译器太实诚了,直接把 Matplotlib数据可视化入门 带入计算了,我们希望的显然不是这样,我们希望 Matplotlib数据可视化入门 用希腊字母进行显示:

plt.figure(figsize = (9, 6))
plt.plot(x, y)
plt.rcParams['font.family'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 28
plt.title('正弦波', fontsize = 18, color = 'red', pad = 20)
plt.xlabel('X')
plt.ylabel('f(x) = sin(x)', rotation = 0, horizontalalignment = 'right')

# 设置y轴上的刻度为:-1 0 1
plt.yticks([-1, 0, 1])
# 设置x轴的刻度
plt.xticks([0, np.pi / 2, np.pi, 1.5 * np.pi, 2 * np.pi],
           [0, r'$\frac{\pi}{2}$', r'$\pi$', r'$\frac{3\pi}{2}$', r'$2\pi$'])

Matplotlib数据可视化入门
当然我们可以设置颜色,比如我们设置横坐标刻度为红色:

plt.figure(figsize = (9, 6))
plt.plot(x, y)
plt.rcParams['font.family'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 28
plt.title('正弦波', fontsize = 18, color = 'red', pad = 20)
plt.xlabel('X')
plt.ylabel('f(x) = sin(x)', rotation = 0, horizontalalignment = 'right')

# 设置y轴上的刻度为:-1 0 1
plt.yticks([-1, 0, 1])
# 设置x轴的刻度
plt.xticks([0, np.pi / 2, np.pi, 1.5 * np.pi, 2 * np.pi],
           [0, r'$\frac{\pi}{2}$', r'$\pi$', r'$\frac{3\pi}{2}$', r'$2\pi$'],
           color = 'red')

Matplotlib数据可视化入门

1.3 图例

🚩图例就是在同一个表中显示多个图,我们要区分它们所对应的小框框:
Matplotlib数据可视化入门

import numpy as np
import matplotlib.pyplot as plt

# x轴
x = np.linspace(0, 2 * np.pi)
# y轴
y = np.sin(x) # 正弦
# 绘制线形图
# 调整尺寸
plt.figure(figsize=(9,6))
# 绘制正弦波
plt.plot(x,y)

# 绘制余弦波
plt.plot(x,np.cos(x))
plt.legend(['Sin', 'Cos'],fontsize = 18, # 字体大小
           loc = 'center',    # 图例居中
           ncol = 2,          # 图例展示时2个为一行
           # 设置图例的位置 [x,y,width,height]
           bbox_to_anchor = [0, 1.05, 1, 0.2]) 
           # 我们规定图形左下角为(0,0),右上角为(1,1)
           # 表示图例的位置在(0,1.05)的位置,且我们设置了居中

Matplotlib数据可视化入门

1.4 脊柱移动

🚩脊柱移动翻译成大白话就是黑色边框的移动

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 50)
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize = (9 ,6))

# plot绘制了两个图形,x-y成对出现就可以!!!
plt.plot(x,np.sin(x),x,np.cos(x))

# 获取当前视图
ax = plt.gca()

# 右边和上面脊柱消失,白色就是消失
ax.spines['right'].set_color('white') # 白色
ax.spines['top'].set_color('#FFFFFF') # 白色

# 设置下面左边脊柱位置,data表示数据,axes表示相对位置0~1
ax.spines['bottom'].set_position(('data', 0))  # 中间(竖直)
ax.spines['left'].set_position(('data' , 0))   # 中间(水平)

plt.yticks([-1,0,1],labels = ['-1', '0', '1'],fontsize = 18)
plt.xticks([-np.pi, -np.pi / 2, np.pi / 2, np.pi],
           labels = [r'$-\pi$', r'$-\frac{\pi}{2}$', r'$\frac{\pi}{2}$', r'$\pi$'],
           fontsize = 18)

Matplotlib数据可视化入门

1.5 图片保存

🚩我们可以把我们绘制好的图形进行保存:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 50)
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize = (9 ,6))

# plot绘制了两个图形,x-y成对出现就可以!!!
plt.plot(x,np.sin(x),x,np.cos(x))

# 获取当前视图
ax = plt.gca()

# 右边和上面脊柱消失,白色就是消失
ax.spines['right'].set_color('white') # 白色
ax.spines['top'].set_color('#FFFFFF') # 白色

# 设置下面左边脊柱位置,data表示数据,axes表示相对位置0~1
ax.spines['bottom'].set_position(('data', 0))  # 中间(竖直)
ax.spines['left'].set_position(('data' , 0))   # 中间(水平)

plt.yticks([-1,0,1],labels = ['-1', '0', '1'],fontsize = 18)
plt.xticks([-np.pi, -np.pi / 2, np.pi / 2, np.pi],
           labels = [r'$-\pi$', r'$-\frac{\pi}{2}$', r'$\frac{\pi}{2}$', r'$\pi$'],
           fontsize = 18)

# 图片保存到当前路径下,命名为 1.png
plt.savefig('./1.png')

Matplotlib数据可视化入门
我们在保存的时候,可以修改屏幕像素密度:Matplotlib数据可视化入门(默认为100)

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 50)
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize = (9 ,6))

# plot绘制了两个图形,x-y成对出现就可以!!!
plt.plot(x,np.sin(x),x,np.cos(x))

# 获取当前视图
ax = plt.gca()

# 右边和上面脊柱消失,白色就是消失
ax.spines['right'].set_color('white') # 白色
ax.spines['top'].set_color('#FFFFFF') # 白色

# 设置下面左边脊柱位置,data表示数据,axes表示相对位置0~1
ax.spines['bottom'].set_position(('data', 0))  # 中间(竖直)
ax.spines['left'].set_position(('data' , 0))   # 中间(水平)

plt.yticks([-1,0,1],labels = ['-1', '0', '1'],fontsize = 18)
plt.xticks([-np.pi, -np.pi / 2, np.pi / 2, np.pi],
           labels = [r'$-\pi$', r'$-\frac{\pi}{2}$', r'$\frac{\pi}{2}$', r'$\pi$'],
           fontsize = 18)

# 图片保存到当前路径下,命名为 2.png,像素密度设为 300
plt.savefig('./2.png', dpi = 300)

Matplotlib数据可视化入门
从两张图片的大小上其实就能看出清晰度的高低,因为保存的是同一张图
当然,我们也可以保存成 Matplotlib数据可视化入门

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 50)
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize = (9 ,6))

# plot绘制了两个图形,x-y成对出现就可以!!!
plt.plot(x,np.sin(x),x,np.cos(x))

# 获取当前视图
ax = plt.gca()

# 右边和上面脊柱消失,白色就是消失
ax.spines['right'].set_color('white') # 白色
ax.spines['top'].set_color('#FFFFFF') # 白色

# 设置下面左边脊柱位置,data表示数据,axes表示相对位置0~1
ax.spines['bottom'].set_position(('data', 0))  # 中间(竖直)
ax.spines['left'].set_position(('data' , 0))   # 中间(水平)

plt.yticks([-1,0,1],labels = ['-1', '0', '1'],fontsize = 18)
plt.xticks([-np.pi, -np.pi / 2, np.pi / 2, np.pi],
           labels = [r'$-\pi$', r'$-\frac{\pi}{2}$', r'$\frac{\pi}{2}$', r'$\pi$'],
           fontsize = 18)

# 图片保存到当前路径下,格式为 pdf,命名为 1.pdf
plt.savefig('./1.pdf')

Matplotlib数据可视化入门
Matplotlib数据可视化入门
如果你觉得白底太过于单调,我们在设置字体大小的时候可以设置颜色(改变边框的颜色):

# 设置一个绿边框
plt.figure(figsize = (9 ,6), facecolor = 'green')

Matplotlib数据可视化入门
如果我们想改变的是底色,我们可以在获取视图后进行更改:

# 获取当前视图
ax = plt.gca()
# 底色改为绿色
ax.set_facecolor('green')

Matplotlib数据可视化入门
查看我们可以设置哪些颜色可以编写代码:

# 查看所有颜色
plt.colormaps()

Matplotlib数据可视化入门

2.风格和样式

2.1 颜色、线形、点形、线宽、透明度

🚩下图代表我们可以使用的颜色:
Matplotlib数据可视化入门
接下来我们结合代码去进行讲解:

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 20)

y1 = np.sin(x)
y2 = np.cos(x)

# 设置颜色,线型,点型
# 绘制x,y1的图形,颜色是 indigo,线形为'-.',图像上点的类型是五边形'p
plt.plot(x, y1, color = 'indigo', ls = '-.', marker = 'p')
# 绘制x,y2的图形,颜色是 #FF00EE,线形为'-',图像上点的类型是圆圈'o'
plt.plot(x, y2, color = '#FF00EE', ls = '--', marker = 'o')
# 绘制x,y1+y2的图形,颜色是(0.2, 0.7, 0.2),线形为':',图像上点的类型是五角星'*'
plt.plot(x, y1 + y2, color = (0.2, 0.7, 0.2), marker = '*',ls = ':')
# 绘制x,y1+2*y2的图形,线宽为3,透明度为0.7,颜色为 orange
plt.plot(x, y1 + 2 * y2, linewidth = 3, alpha = 0.7, color = 'orange') # 线宽、透明度
# 参数连用
# 绘制x,2*y1-y2的图形,b代表color:blue;o代表marker:'o';--代表ls:'--'
plt.plot(x, 2 * y1 - y2, 'bo--') 

Matplotlib数据可视化入门

2.2 更多属性设置

import numpy as np
import pandas as pd

def f(x):
    return np.exp(-x) * np.cos(2 * np.pi * x)

x = np.linspace(0, 5, 50)
plt.figure(figsize = (9, 6))
plt.plot(x, f(x), color = 'purple', # 线颜色
         marker = 'o',              # 图像中的点的形状
         ls = '--',                 # 线形
         lw = 2,                    # 线宽
         alpha = 0.6,               # 透明度
         markerfacecolor = 'red',   # 点颜色
         markersize = 10,           # 图像中点的大小
         markeredgecolor = 'green', # 点边缘颜色
         markeredgewidth = 3)       # 点边缘宽度

plt.xticks(size = 18)               # 设置刻度大小
plt.yticks(size = 18)

Matplotlib数据可视化入门

3.训练场

3.1 绘制如下图形

Matplotlib数据可视化入门
要求:

  • 设置背景颜色为:灰色
  • 设置视图颜色为:灰色
  • 设置网格线颜色:白色
  • 设置网格线样式:虚线
  • 函数关系如下:y = np.sin(x + i * 0.5) * (7 – i)
    • 方程中的i可以给定范围1~6,表示图片中的6条线
import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize = (9, 6), facecolor = 'gray')

def fun(x):
    for i in range(1, 7):
        y = np.sin(x - 0.5 * i) * (7 - i)
        plt.plot(x, y)
# 画图范围从 0~14,分成200份
x=  np.linspace(0, 14, 200)
fun(x)

# 获取当前视图
ax = plt.gca()
ax.set_facecolor('gray')
# 添加网格线
plt.grid(color = 'white', linestyle = '--')

Matplotlib数据可视化入门

3.2 根据提供数据,进行分组聚合运算,绘制如下图形

Matplotlib数据可视化入门

要求:

  • 分组聚合求各个城市春夏秋冬的PM2.5的平均值
  • 对分组聚合结果进行数据重塑
  • 调整行索引顺序按照:北京、上海、广州、沈阳、成都
  • 调整列索引顺序:春夏秋冬
  • 使用DataFrame方法绘制条形图

首先我们需要下载一个 Excel 文件:

链接: https://pan.baidu.com/s/1ns8p3xD_EVS2GNNKApDtLg?pwd=eu4u
提取码: eu4u

下载完成之后,把该文件和我们的代码放到同一个文件夹下,这一操作我们在之前的博客中已经反复说到,这里就不再进行演示

注:代码处于运行中将显示:
Matplotlib数据可视化入门
下列代码运行几十秒甚至几分钟都是正常的,耐心等待运行结果即可。

我们先来加载我们的数据

%%time
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_excel('./PM2.5.xlsx')
display(df.head(10))
df.shape

Matplotlib数据可视化入门

# 根据 城市,季节进行分组,获取PM2.5的数据并求平均
df.groupby(by = ['城市', '季节'])['PM2.5'].mean()

Matplotlib数据可视化入门
数据看起来不太舒服,把它变成 Matplotlib数据可视化入门 格式,并保留两位小数

df2 = df.groupby(by = ['城市', '季节'])[['PM2.5']].mean().round(2)
df2

Matplotlib数据可视化入门
数据还是看起来不美观,数据重塑:

df2 = df2.unstack(level = -1)
df2

Matplotlib数据可视化入门
删除掉 PM2.5:

df2.columns = df2.columns.droplevel(level = 0)
df2

Matplotlib数据可视化入门
调整列索引的顺序:

df2 = df2[list('春夏秋冬')]
df2 = df2.loc[['北京', '上海', '广州', '成都', '沈阳']]
df2

Matplotlib数据可视化入门

绘图:

plt.rcParams['font.family'] = 'KaiTi'
plt.rcParams['font.size'] = 18
df2.plot.bar(figsize = (12, 9))
plt.grid(color = 'gray', ls = '--')

Matplotlib数据可视化入门

版权声明:本文为博主辰chen原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/qq_52156445/article/details/122645792

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2022年1月23日 下午1:13
下一篇 2022年1月23日

相关推荐