Matplotlib 技巧

收集各种技巧、解决问题的办法。不断加深理解、熟悉matplotlib的使用。

中文

查看支持的中文字体

运行如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from matplotlib.font_manager import FontManager
import subprocess

fm = FontManager()
mat_fonts = set(f.name for f in fm.ttflist)

output = subprocess.check_output(
'fc-list :lang=zh -f "%{family}\n"', shell=True)

zh_fonts = set(f.split(',', 1)[0] for f in output.split('\n'))
available = mat_fonts & zh_fonts

# 可用中文字体
for f in available:
print f

尝试发现matplotlib自带了一个可以显示中文的字体Arial Unicode MS。于是可以如下设置,不用下载字体,不用修改matplotlib配置文件。

1
2
from matplotlib import rcParams
rcParams['font.sans-serif'] = ['Arial Unicode MS']

搞定中文乱码!

Figure

设置图片大小

px(pixel), inch, pt(point)三者之间的关系为

1
2
3
1 px = constant size on screen
1 inch = dpi px # dpi is variable
1 inch = 72 pt # 确定关系

Figure size (figsize) 决定figure的尺寸,单位为inches。默认大小为[6.4, 4.8]

Dots per inches (dpi) 决定figure包含多少像素。默认大小为100。设置为figsize=(w,h)figure包含

1
2
3
px, py = w * dpi, h * dpi   # pixels
# e.g.
# 6.4 inches * 100 dpi = 640 pixels

因此若要获得例如(1200, 600)大小的figure,单位为pixel,可以有各种不同的组合方式

1
2
3
4
figsize = (15. 7.5), dpi = 80
figsize = (12. 6) , dpi = 100
figsize = (8, 4) , dpi = 150
figsize = (6, 3) , dpi = 200

以上组合方式的不同之处在哪里?

差异在图形中线条、文字的粗细不同。figure中大多数元素如线条、标记、文本的size的单位为pointsMatplotlib设置 Points per inch (ppi) 等于72。因此无论 dpi 等于多少,一英寸只画72个点。或者说 dpi 决定线条粗细,figsize决定内容多少。