Python绘图

前言

首先说明, 这里的绘图, 不是指像turtle那样的绘画, 而是指利用代码生成条形图、树状图、饼图等对数据进行统计分析.

绘图需要用到两个知名库: Matplotlib和Numpy

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库, 支持大量的维度数组与矩阵运算, 此外也针对数组运算提供大量的数学函数库.

Matplotlib 是一个非常强大的 Python 画图工具, 我们可以使用该工具将很多数据通过图表的形式更直观的呈现出来.

Matplotlib 可以绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等等.

配置环境

  1. 最简单的方式: 下载安装Anaconda, 利用conda的虚拟环境自带的Matplotlib和Numpy

  2. 利用venv(其实也可以直接装, 只不过是为了防止系统内的包变乱):

    1
    2
    3
    4
    5
    6
    7
    8
    # ubuntu安装GUI库
    zxq@zxq-virtual-machine:~/python$ sudo apt install python3-tk
    # 创建虚拟环境
    zxq@zxq-virtual-machine:~/python/matplotlib$ python -m venv matenv
    # 激活虚拟环境
    zxq@zxq-virtual-machine:~/python/matplotlib$ source matenv/bin/activate
    # 安装库
    (matenv) zxq@zxq-virtual-machine:~/python/matplotlib$ pip install numpy matplotlib

第一个图

一条直线

1
2
3
4
5
6
7
8
9
10
11
12
# 引入绘图库
import matplotlib.pyplot as plt
import numpy as np

# 生成[-1, 1]的50个点
x = np.linspace(-1,1,50)
# 描绘函数关系
y = 2*x+1
# 绘图
plt.plot(x,y)
# 展示
plt.show()

运行, 得到如下图效果

image-20220731212331702

**注意: **

  1. import matplotlib.pyplot as plt

    我们不需要引入整个库, 大部分要用到的功能都在pyplot这个子库内, plt是为了后续简写

  2. import numpy as np

    numpy用来产生数据进行绘图

  3. 预览图下方几个按钮的作用

    前三个: 回到初始/前一个/后一个预览状态

    第四个: 移动图像展示位置

    第五个: 放大接下来框选的函数图像

    第六个: 调节图像上下左右边距等

    最后一个: 将当前显示的图像存盘了

多画几张

分隔不同图像, 可以使用plt.figger()函数

该函数内可传入参数:

mum: 图像序号(标题栏内数字)

figsize: 图像大小 (长,宽,元组形式传入)

再画一条

单个图内可以画多条线, 直接使用plt.plot()即可.

该函数可传入参数:

x,y: 字面意思,不表

color: 线的颜色,以文本形式传入,支持名称("red")或色号("#a02536")

linewidth: 线的宽度,默认为1.0

linestyle: 线的形式(如"--"为虚线)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-3,3,50)
y1 = 2*x+1
y2 = x*x

plt.figure()
plt.plot(x,y1)

plt.figure(num=114514,figsize=(8,5))
plt.plot(x,y2)
plt.plot(x,y1,color="#a02536",linewidth=3.0,linestyle="--")

plt.show()

image-20220731223501336

设置坐标轴

图像取值范围

plt.xlim(),plt,ylim(), 传入参数的形式为元组.

横纵轴名称

plt.xlabel(),plt.ylabel(), 传入值为文本.

坐标轴分段

plt.xticks(),plt.yticks(), 传入参数由numpy生成,如:

1
2
3
# [-1,2]之间分12个段
new_ticks = np.linspace(-1,2,13) # 注意这里,12段==13个点
plt.xticks(new_ticks)

文字坐标轴

形成如下图中y轴的效果

image-20220731233021534

仍然使用plt.xticks(),plt.yticks(), 传入参数为两个列表, 第一个存文字对应数值, 第二个存文字, 一一对应, 如:

1
plt.yticks([-2,-0.5,1,2,3],['really bad','bad','normal','good','very good'])

英文字体美化

即 very good -> $very\ good$

这里用到了$\LaTeX$行内公式转换, 步骤如下:

  1. 文本前加字母r, 将文本套在$$
  2. 空格 需要转义, 每个空格前面加一个\

样例如下:

1
[r'$really\ bad$',r'$bad$',r'$normal$',r'$good$',r'$very\ good$']

其余符号也可按照$\LaTeX$语法来写,如$\alpha$->\alpha