1、启动方式

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

##(1)在普通python解释器/python脚本中
x = np.linspace(0,10,100)
plt.plot(x, np.sin(x), '-')
plt.show()

##(2)在ipython解释器中
%matplotlib                   #只需声明一次
x = np.linspace(0,10,100)
plt.plot(x, np.sin(x), '-')

##(3)在jupyter中               
%matplotlib inline            #只需声明一次
x = np.linspace(0,10,100)
plt.plot(x, np.sin(x), '-')

下述命令均在jupyter中学习

2、绘图基础

2.1 基本原则

首先需要明白画板figure与坐标系axes的关系

(1)基于matplot方式绘图时,必须首先创建画板(显式或隐式的方法)

(2)一个画板可以只绘制一张图(axis),也可以划分为多个子图(axes)

(3)一张图内可以同时叠加多种图形类型,比如线图、点图等

在这里插入图片描述

(1)关于创建画板

  • plt.figure()可以显示地创建新画板,以及默认的一个axes
  • 使用plt.***系列绘图函数
    • 首先会寻找当前活跃的画板与Axes,然后在其基础上继续绘图
    • 若没有找到,则会隐式地创建一个新画板,以及默认的一个axes
  • 基于axes对象的绘图方法可针对特定Axes实例进行一对一的绘图
    • 使用axes绘图方法时,会定义当前活跃的axes;之后可继续使用plt.***系列函数
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
##(1) 显式创建画板
# 显式创建画板,并赋值给fig变量,可以方便后续图片调用与保存等
fig = plt.figure()
# 仅显式创建画板,不赋值;不会影响后面的绘图
# plt.figure()  

# 若直接在画板绘图,默认画板仅包含一张图
plt.plot([1,2],[2,1])

##(2) 隐式创建画板
#若事先没有定义画板
#plt绘图函数会自动创建一个画板和一个axes
plt.plot([1,2],[2,1])

若使用plt.***继续绘图前没有创建画板时

  • 若之前已有活跃的画板,会继续在叠加图形
1
2
3
plt.figure()
plt.plot([1,2],[2,1])
plt.plot([1,2],[1,2])
  • 若目前都没有画板,或者想另建一个画板
1
2
3
4
5
6
#隐式创建画板
plt.plot([1,2],[2,1])

#显式另创建画板
plt.figure()
plt.plot([1,2],[1,2])

(2)多子图绘图模式

  • 方法1:首先创建画板,然后划分子图
1
2
3
4
5
6
7
8
9
## (1) .add_subplot() 方法
fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax1.plot([1,2],[-1,-2])
plt.plot([1,2],[1,2])    #在当前活跃的axes中绘图

ax2 = fig.add_subplot(2,1,2)
ax2.plot([1,2],[-2,-1])
plt.plot([1,2],[2,1])    #在当前活跃的axes中绘图

plt.***系列广义绘图函数会在当前活跃的画板/axes上画图(如没有,会创建)

ax.***系列基于对象的绘图函数会点对点的在指定axes中进行绘图

1
2
3
4
5
6
7
8
9
## (2) plt.subplot() 函数
fig = plt.figure()
ax1 = plt.subplot(2,1,1)
ax1.plot([1,2],[-1,-2])
plt.plot([1,2],[1,2])

ax2 = plt.subplot(2,1,2)
ax2.plot([1,2],[-2,-1])
plt.plot([1,2],[2,1])
  • 方法2:直接创建含有若干子图的画板
1
2
3
fig, ax = plt.subplots(1,2)
ax[0].plot([1,2],[-1,-2])
ax[1].plot([1,2],[1,2])

当然也适用于画板中仅包含一张图的情况。

2.2 基于plt接口的常用方式

plt.plot() : 最基础绘图命令,用于绘制点图、线图

plt.title(), plt.xlabel(), plt.ylabel() : 用于设置总标题、x轴标题、y轴标题

plt.xlim(), plt.ylim() , plt.axis(): 用于设置x轴与y轴的范围

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
x = np.linspace(0,10,100)
##(1) 极简绘图
plt.plot(x, np.sin(x), '-')

##(2) 可多图叠加在一个坐标轴体系
plt.plot(x, np.sin(x), '-')
plt.plot(x, np.cos(x), '--')

##(3) 应用上述参数
fig1 = plt.figure() 
plt.plot(x, x, '-')
plt.xlim(1,5)
plt.ylim(2,6)
# plt.axis([1,5,2,6]) 
plt.xlabel("AA")
plt.ylabel("BB")
plt.title("TITLE")

fig1                               #展示图片
fig1.savefig("test.png")           #保存图片
from IPython.display import Image
Image("test.png")                  #读取图片
image-20220520081039880

2.3 基于对象接口的常用方式

上面所说大部分plt命令都可转为对象的方法。相比之下更加灵活、尤其在绘制多子图时。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
x = np.linspace(0,10,100)

##(1) 基础
x = np.linspace(0,10,100)
ax = plt.axes()  #轴+标签
ax.plot(x, x+1)

##(2) 部分与plt函数名有出入的对象方法
ax = plt.axes()
ax.plot(x, x+1)
ax.set_xlim(1,5)
ax.set_ylim(2,6)
ax.set_xlabel("AA")
ax.set_ylabel("BB")
ax.set_title("TITLE")

##(3) 通过set方法提前设置绘图属性
ax = plt.axes() 
ax.set(xlabel="AA", ylabel="BB", title="TITLE",
        xlim=(1,5), ylim=(2,6))
ax.plot(x, x+1)
image-20220520081108550

3、plt.plot绘制线图与点图

(1)线图

plt.plot()默认绘制线图

color参数设置颜色(也适用于后面的绘图),linestyle参数设置线型

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
x = np.linspace(0,10,100)
##(1) color
#可以是标准颜色名称,十六进制颜色代码,颜色简写等
#‘b’-blue;‘g’-green; ‘r’-red;‘c’-cyan;‘m’-magenta;‘y’-yellow;‘k’-black;‘w’-white
plt.plot(x, x+1, color="red")
plt.plot(x, x+2, color="#7fc97f")
plt.plot(x, x+3, color="k")

##(2) linestyle
#可以是标准线型名称,或者符号表示
plt.plot(x, x+1, linestyle="-")  # solid(default)
plt.plot(x, x+2, linestyle="--") # dashed
plt.plot(x, x+3, linestyle=":") # dotted
Linestyles — Scipy lecture notes

(2)点图

通过设置marker参数设置点的形状,以表明绘制点图

1
2
3
4
5
6
7
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
x = np.linspace(0, 10, 20)
plt.plot(x, x+1, 'o')   # circle
plt.plot(x, x+2, '.')   # point
plt.plot(x, x+3, ',')   # pixel

image-20220521080215415

plt.scatter绘制散点图

c表示点的属性映射点的颜色集,可配合cmap参数使用;s表示点的属性映射点的大小

1
2
3
4
5
6
7
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
x = np.linspace(0, 10, 20)
colors = np.random.random(20)
# plt.cm.get_cmap("coolwarm") #预先查看示例
plt.scatter(x, x+1, c=colors, cmap = plt.cm.coolwarm) 
Choosing Colormaps in Matplotlib — Matplotlib 3.5.0 documentation

在https://www.osgeo.cn/matplotlib/tutorials/colors/colormaps.html,可查看plt.cm所提供的所有颜色系列。

4、修饰绘图细节

(1)绘图主题

python的style模块提供了一组用于绘制特定风格主题的图形

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

%matplotlib inline

print(plt.style.available[0:10])
# ['Solarize_Light2',
# '_classic_test_patch',
# '_mpl-gallery',
# '_mpl-gallery-nogrid',
# 'bmh',
# 'classic',
# 'dark_background',
# 'fast',
# 'fivethirtyeight',
# 'ggplot']

#只需在绘图前声明,会改变之后所有绘图的风格
plt.style.use("classic")
x = np.linspace(0,10,20)
plt.plot(x, x+1)

(2)图例

plt.legend默认按照每个plot的label标签绘制legend

  • loc 修改legend的位置,默认为“best”
  • ncol 修改列数;fontsize 字体大小;title 设置标题
image-20220523073054458
1
2
3
4
5
6
x = np.linspace(0,10,100)
plt.plot(x, x+1,  label="group-1")
plt.plot(x, np.sin(x), label="group-2")
#plt.legend()
plt.legend(loc="best", ncol=2, 
           fontsize = 12,title="legend title")

image-20220527070424558

(3)文本注释

plt.text:前两个参数设置注释文本的坐标,第三个参数交代注释文本内容,之后的参数对文本的格式属性进行调节,其中ha可以调整注释文本相对于坐标点的位置,默认为左对齐。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
x = np.linspace(0,10,20)
plt.plot(x, x+1,"o")
plt.text(2,2,"Annotation1", size=12, color="red")
plt.text(8,8,"Annotation-ha-center", ha='center')

##如上默认在所提供的坐标位置处进行注释
##如果想按坐标轴相对左下角的位置进行注释,可使用ax方式绘图,设置transform参数
ax = plt.axes()
ax.plot(x, x+1)
plt.text(4,4,"Annotation-ha-center", transform=ax.transData)      #默认按照坐标
plt.text(0.2,0.8,"Annotation-ha-center", transform=ax.transAxes)  #相对坐标原点的位置

image-20220527070501510

plt.annotate:可在注释文本加上箭头标注

1
2
3
4
5
6
7
8
## 第一个参数设置注释的文本
## xy参数设置箭头指向的坐标
## xytext参数设置箭头起点的坐标
## arrowprops参数以字典的形式设置箭头的样式
x = np.linspace(0,10,20)
plt.plot(x, x,"o")
plt.annotate("This is point(2,2)", xy=(2,2), xytext=(3,8),
            arrowprops=dict(facecolor="black"))

关于箭头,还有很多细节的调整,包括粗细、方向、曲度等等。

image-20220527070525716

(4)坐标轴刻度

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
##(1) log单位的坐标轴刻度
ax = plt.axes(xscale='log', yscale='log')
ax.plot(x, x)

##(2) 移除坐标轴的刻度线与标签
ax = plt.axes()
ax.plot(x, x)
ax.yaxis.set_major_locator(plt.NullLocator())      #移除y轴的刻度线与标签
ax.xaxis.set_major_formatter(plt.NullFormatter())  #仅移除x轴的标签

##(3) 设置坐标轴的刻度线数量
ax = plt.axes()
ax.plot(x, x)
ax.yaxis.set_major_locator(plt.MaxNLocator(3))  

image-20220527071933830


如上记录的Matplotlib的基本使用方式。关于绘图类型仅学习了点图与线图的绘制方式,实际上其支持许多种绘图类型。

Seaborn是在Matplotlib基础上开发的一套新的绘图包。相对Matplotlib来说,Seaborn的绘图代码更加简洁、美观;更加可以使用dataframe数据绘制。(感觉可以对应于R语言中的ggplot)。