pyplot的那些奇技淫巧

周日终于把可塑性的这篇文章交给王博士看了, 昨天也把pku的合作的文章的群落聚类图给做出来了, 可以小喘息一会; 不过9月初还得回学校, 事情一点也不少. 趁着今天有时间, 把这几天绘图的一些”心得体会”梳理一下咯.

Matplotlib可以说是Python绘图唯一选择, 可惜就是官方文档超级难用, 各种类的嵌套关系不明不白, 到网上一搜问题, Stack Overflow出来的解答都是10yrs ago… 在此机会整理一个属于自己的pyplot使用大全.

初始化定义与常用绘图

一张画布叫Figure, 画布中的一个方框图标叫Axes, 每一个Axes的两个轴叫Axis.

梳理好这个结构的话, 那最标准的初始化代码是:

1
2
3
4
5
import matplotlib.pyplot as plt
# 无论是否有多图, 都使用这条语句初始化
fig, ax = plt.subplots(figsize=(5, 3))
# 如果绘制两张图并排, 则
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

因此, 具体数据的绘制, 都是在Axes对象下进行的. 这段时间用到的绘图有:

1
2
3
4
ax.plot(list_x, list_y, **kwags)
ax.bar(list_x, list_y, color='#327512')
ax.fill_between(list_x, list_y1, list_y2, color='#520520')
ax.boxplot(list_of_list, labels=label_list, **kwags)

而设置具体的格式(主要是坐标轴、标签等行为), 也主要是以Axes为出发. 具体见下节.

Axes行为控制

ticks & labels & ticklabels

ticks就是坐标轴上的小点点, ticklabel是对应tick的文字标注. 可以使用多种方法设定其格式, 比较推荐的是:

1
2
3
4
5
6
ax.tick_params(
axis={'x', 'y', 'both'},
direction={'in', 'out', 'inout'},
length=6, width=2, color='k',
labelsize=20, labelcolor='k', labelrotation=45
)

但是需要注意, 这种方法似乎没法设定旋转后的ticklabel的alignment信息.

另外的一种方法ax.set_xticks()也有类似的作用, 我是拿来作间隔tick用的:

1
2
# x轴日期太密了, 每5天取一天展示
ax.set_xticks(ax.get_xticks()[::5], ax.get_xticklabels()[::5], size=18, name='Arial')

另外还有就是对不同轴的意义的描述, 称为label. 使用下面的语句设定.

1
ax.set_ylabel('daily rainfall (mm)', fontdict={"fontsize":22, "fontname":'Arial'}, labelpad=12)

发现了吧, 哪里都能设置字体, 而且有的是size有的是fontsize之类的[/晕]

其他行为控制

剩下的一些控制, 列在下面:

1
2
3
4
5
ax.set_ylim(ymin=0, ymax=100)	# 圈定显示范围
ax.spines['top'].set_visible(False) # 设置Axes的上边框不可见
# 注意: 有tick和ticklabels的那根轴不要设invisible
ax.spines['left'].set_position(("outward", 10)) # 设置左轴向外偏移
ax.legend(loc = "best", fontsize=24) # 加入图例, loc可以有其他写法
左轴向外偏移like this

指定全局字体

1
matplotlib.rc('font', size=20, family='Arial')

这样一条语句, 放在fig定义之前, 可以设定全局默认字体与字号; 其中的family字段还可以设置成字体的类别, 如normal, monospace等等.

多y轴/多x轴图表

有些图需要展示多重信息, 比如同时展示一段时间内的气温变化与降雨量, 则需要左边y轴标明温度, 右边y轴标明是降雨量.

在Matplotlib中, 使用ax.twinx()来生成一个新的Axes, 这个新Axes和之前的ax共用一个x轴, 因此也就是双y轴图表.

多个图表的堆叠, 可以使用zorder区分关系, 越大的zorder代表越靠近顶端; 但是不要忘了给上层图表设置facecolornone, 即”底色为透明而不是白色”, 方便下层图表的展示.

1
2
3
4
5
6
7
fig, ax_btm = plt.subplots(figsize=(16,6))
ax_btm.bar(x, y, color='#abcdef')
ax2_top = ax_btm.twinx()
ax2_top.plot(xx, yy, c='k')
ax2_top.set_facecolor('none')
ax2_top.set_zorder(2)
ax_btm.set_zorder(1)

去掉Axes内的间隔

如上图所示, 07-19左边是没有空格的. 但是默认的绘图, 最左边和最右边的xtick两侧都会有一定的空白. 可以通过以下设置去除:

1
plt.rcParams['axes.xmargin'] = 0.0

Finally

暂时就想到这么多, 之后的内容再补充. 难得小休息一下, 明天要继续看论文咯.

_________, 启动!

评论