Matplotlib 配置

配置文件matplotlibrc

配置文件路径

  • /current/dir/matplotplibrc
  • $MATPLOTLIBRC/matplotlibrc
  • ~/.config/matplotlib/matplotlibrc(~/.matplotlib/matplotlibrc)
  • /path/to/matlabplot/mpl-data/matplotlibrc

查看实际路径

1
$ python -c 'import matplotlib as mpl; print(mpl.matplotlib_fname())'

中文问题

字符编码问题

  • python2中默认字符编码方案是ascii,需要更改为utf-8

    1
    2
    3
    import sys
    reload(sys)
    sys.setdefaultencoding("utf8")
  • python3则默认为utf-8编码,无需其他操作

字体文件缺失

  • mpl不兼容ttc文件,只能识别ttf文件
  • mpl默认使用/path/to/matplotlib/mpl-data/fonts中的字体 文件
  • ttc和ttf格式参见cs_program/character

管理单个图表

  • 通过mpl字体管理器管理单个图表元素字体
    • 对每个需要使用该字体的图表元素,都需要传递相应的参数
    • 无需字体都不需要安装
1
2
ch=mpl.font_manager.FontProperties(fname=/path/to/font.ttf)
ax.set_title(name, fontproperties=ch)

运行时配置MPL默认字体

1
2
3
4
5
6
7
 # 必须在`plt.plot()`类似的绘图语句执行之前执行
# `font-name`为已安装字体名称而不是字体文件名
mpl.rcParams['font.default-font-family'].insert(0, font-name)
# 查看当前默认font-family
mpl.font_manager.FontProperties().get_family()
# 一般默认字体族是"sans-serif",所以应该将字体名称插入其首位
mpl.rcParams['font.sans-serif'].insert(0, font-name)
  • 运行时指定“已安装”字体给当前执行mpl配置中默认字体

    • 系统中已安装ttf字体,即fc-查找目录

      • /usr/share/fonts/
      • $HOME/.local/share/fonts/
      • $HOME/.fonts/
    • /path/to/matplotlib/mpl-data/fonts/中字体文件对应 字体

  • 已安装字体指mpl.font_manager.FontManager能找到字体,但 不是所有系统已安装字体,mpl均可找到、使用

    1
    2
    # 获取mpl所有可用字体并排序
    sorted([i.name for i in mpl.font_manager.FontManger().ttflist])
    • 字体文件问题:mpl不兼容ttc字体文件

    • 缓存问题:mpl可能在~/.cache/matplotlib/下有cache 文件,mpl会直接从中获取可用字体列表,新字体可能需 删除才能在mpl中生效

      1
      2
      # 获取mpl缓存文件夹
      mpl.get_cachedir()

修改MPL配置文件

  • 修改配置文件更改全局默认字体

    • 将字体名称添加在默认字体族首位,作为最优先候选字体

      1
      font.sans-serif : font-name,
  • 同样要求mpl能够找到、使用相应的字体文件

图片显示

X11依赖

  • mpl一般在常用于包含有X11的图形化界面中,所以若X11不可用 则需修改mpl配置

  • 对生成pdf、png、svg等,可以修改后端为Agg

    • 运行时修改

      1
      2
      3
      4
      import matplotlib as mpl
      # 须在导入`pyplot`前执行
      mpl.use("Agg")
      from matplotlib import pyplot as plt
    • 修改配置文件

      1
      backend: TkAgg

By default, matplotlib ships configured to work with a graphical user interface which may require an X11 connection. Since many barebones application servers don’t have X11 enabled, you may get errors if you don’t configure matplotlib for use in these environments. Most importantly, you need to decide what kinds of images you want to generate(PNG, PDF, SVG) and configure the appropriate default backend. For 99% of users, this will be the Agg backend, which uses the C++ antigrain rendering engine to make nice PNGs

Matplotlib.plot笔记

图像元素

Figure

整个窗口(句柄)

1
2
fig=plt.figure(num=None, figsize=None, dpi=None,
facecolor=None, edgecolor=None, frameon=True)

Axes

图像(子图)(句柄)

1
2
3
4
5
6
7
8
9
10
11
12
13
None=plt.subplot(*arg, **karg)
// 创建并激活axes
None=plt.subplot(num=int(row-col-index)
None=plt.subplot(row, col, index)

fig, axs=plt.subplots(rows=int, cols=int)

fig.add_subplot(rows=int, cols=int, index=int)

ax=fig.add_axes(rect=[left,buttom,width,height],
projection='aitoff'/'hammer'...)
// 指定地点、大小子图
// `rect`参数是百分比

Axies

说明

  • 这三个图像元素都是以句柄形式操作,可以理解为每次操作 都是在一个“容器”中操作,容器由plt管理,每次 plt.show()将图像全部展示之后,容器被回收,创建新容器

  • 因此plt.show()之后,之前容器中的元素更改无法影响到新容器

  • plt可以当作当前激活状态的axes元素的句柄使用

绘图

线图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

None=ax(*args, **kwargs)
# `args`
# [x]=range(len(y))/list
# y=list
# [fmt]=str

# `kwargs`
# data:类似df、dict的indexable对象,传递时x、y可用
标签代替
# linewidth
# markersize
# color
# marker
# linestyle

# examples
None=ax([x], y, [fmt], [x2], y2, [fmt2], **kwargs)
None=ax('xlabel', 'ylabel', data=indexable_obj)
None=ax(2d-array[0], 2d-array[1:])

柱状图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

list=ax.bar(*args, **kwargs)

# `args`
# x=list
# height=num/list
# [width]=num/list
# [bottom]=num/list

# `kwargs`
# align='center'/'edge'
# agg_filter=func
# alpha=None/float
# capstyle='butt'/'round'/'projecting'
#todo

饼图

1
2
3
4
5
6
7
list=ax.pie(x, explode=None/list(%), labels=None/list,
colors=None/list(color), autopct=None/str/func,
pctdistance=0.6, shadow=False, labeldistance=1.1,
startangle=None, radius=None/float,
counterclock=True, textprops=None, center=(0,0),
frame=False, rotatelables=False, hold=None,
data=None/dict(param_above))

箱线图

1
2
list=ax.boxplot(x, notch=False, sym=None/str,
vert=True, whis=1.5/str/list)