python绘图工具包Matplotlib的使用笔记

matplotlib是python中用来绘制数据图的扩展包,功能十分强大,可以绘制曲线图、条形图等。下面是一个曲线图的示例。

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl

## 读取数据文件
data = pd.read_csv("curve1.csv")
x = data['iter']
base = data['base']*100
sen1 = data['sen_s1']*100
sen2 = data['sen_s2']*100
word1 = data['word_s1']*100
word2 = data['word_s2']*100

# 定义matplotlib的全局样式
mpl.style.use('seaborn')

plt.figure(figsize=(12,4.5)) #新建figure,并指定图形大小
plt.tight_layout() #使用紧凑型布局,当有多个subplot时使用

ax = plt.subplot(1,2,1) #和MATLAB的画图命令类似
plt.subplots_adjust(wspace = 0.2, hspace = 0.1) #定义各个子图的间距
plt.plot(x,base,'b-', x, sen1,'g-',x,sen2,'r-')
plt.xscale('log') #将横座标取对数
plt.xlabel('Updates')
plt.ylabel('BLEU Score')
plt.grid(True) #添加网格
plt.legend(labels=[r'$T$', r'$S_1$', r'$S_2$'], loc='best') #添加图例
plt.title('(a) Sentence-Level Regularization',va='bottom') #添加标题

plt.subplot(1,2,2)
plt.plot(x,base,'b-', x, word1,'g-', x,word2,'r-')
plt.xscale('log')
plt.xlabel('Updates')
plt.ylabel('BLEU Score')
plt.grid(True)
plt.legend(labels=[r'$T$', r'$S_1$', r'$S_2$'], loc='best')
plt.title('(b) Word-Level Regularization',va='bottom')
plt.show()

从上面的例子看出,使用Matplotlib画图,先准备数据,定义好全局变量,新建figure(), subplot(),使用plot,bar,hist等命令画图后,设置坐标轴、标题、图例等等,最终采用plt.show()显示图形。下面是一些常用的操作。

自定义全局变量

mpl.rc()提供了修改全局变量的函数,例如mpl.rc('font',size=10)即将图中所有text属性的文字大小设置为10。可以设置的全局变量如下:

  • font
    • family
    • weight
    • size
  • axes
    • titlesize
    • labelsize
  • tick
    • labelsize, 字体大小
  • lines
    • color
    • lw
  • grid
    • c , distance
    • ls, line style
    • lw, line width
  • 更多的信息参考官网

文字标注采用latex

figure的title, xlabel, xtick, text, legend等处支持latex,将’some string’改成 r'$some latex$ other string'即可。

在条形图中标记数据

通过for循环,遍历所有数据点的坐标,并采用plt.text(a, b+0.05, '%.2f' % b, ha='center', va= 'bottom')来进行数据标注。

subplot的标题显示在图片下方

通常subplot的plt.title('one title',va='bottom', fontsize = 10)是显示在图片上方的,如果要在图片下方,需指定y坐标,即改为plt.title('one title',va='bottom', y = -0.05, fontsize = 10),此处y坐标是百分数,相对于整个图片是5%的距离,可自行调节。

绘制分组条形图

分组条形图是常见的用于比较不同方案效果的图形,假如有2种方案,每种方案有3个数据点,那么绘制的分组条形图如下,

图1 分组条形图

相应的代码见样例。方法即分成2组list,画2次bar_plot,每一次分别指定label的名字,以方便绘制legend(),为了使得每组数据内紧密分布,组间距离较远,需要计算相应的x_pos坐标,也同样分成2个list。

控制线条颜色

颜色color='r'表示红色线条,这种配色不太好看。可以直接采用CN系列的色标,比如color='C0',其中,C0可以改成C1~C9,这种颜色用起来方便,也好看一些~

具体介绍参考这里

参考资料

END