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
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])
|
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") #读取图片
|
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)
|
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
|
(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
|
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)
|
在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
设置标题
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")
|
(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) #相对坐标原点的位置
|
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"))
|
关于箭头,还有很多细节的调整,包括粗细、方向、曲度等等。
(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))
|
如上记录的Matplotlib的基本使用方式。关于绘图类型仅学习了点图与线图的绘制方式,实际上其支持许多种绘图类型。
Seaborn是在Matplotlib基础上开发的一套新的绘图包。相对Matplotlib来说,Seaborn的绘图代码更加简洁、美观;更加可以使用dataframe数据绘制。(感觉可以对应于R语言中的ggplot)。