问题
关于matplotlib的断轴处理,网上的资料似乎并不那么多,大多数也没有涉及到原理的说明,下面我将说明一下我对断轴的理解
断轴的原理
进行轴的破断,一般是在数据分别分散在较高的值范围区间和较低的值范围区间,而中间的值范围区间没有数据分布的情况。如果不进行轴的破断,那么绘出的图是显得中间很空。在matplotlib这个可视化库中,断轴其实是使用两个子图来完成的。一般我们经常做的是Y轴上的断轴,则我们使用2行1列的子图进行破断轴的绘制,同时需要进行X轴的共享,即sharex,这样处理的好处在于是的两个子图的x轴同步,且只有最底下的子图有x轴。
断轴的实例代码分析
这个代码是来自于matplotlib的官网的示例:
我将在这段代码里进行断轴设置的注释
import matplotlib.pyplot as plt
import numpy as np
pts = np.array([
0.015, 0.166, 0.133, 0.159, 0.041, 0.024, 0.195, 0.039, 0.161, 0.018,
0.143, 0.056, 0.125, 0.096, 0.094, 0.051, 0.043, 0.021, 0.138, 0.075,
0.109, 0.195, 0.050, 0.074, 0.079, 0.155, 0.020, 0.010, 0.061, 0.008])
#这个仅是生成了两个彼此相隔较远的数据集
pts[[3, 14]] += .8
#两个子图的显示的内容是一样的,但是通过下面的设定不同子图的显示范围,即底下的子图显示低值范围区间的数据,
#而上面的子图显示高值区间的数据
f, (ax, ax2) = plt.subplots(2, 1, sharex=True)
ax.plot(pts)
ax2.plot(pts)
ax.set_ylim(.78, 1.) # outliers only
ax2.set_ylim(0, .22) # most of the data
# spines是轴线或者说边框线,因为破断的关系,我们将底部子图的top线和顶部子图的bottom线去掉,视觉上感觉这是一个图。如果简单的,这个破断y轴就完成了
ax.spines['bottom'].set_visible(False)
ax2.spines['top'].set_visible(False)
#以下三行有点多余,我给注释掉了,同时使用plt.setp(ax.get_xticklines(), visible=False)。即可,最后会给出原代码以及我修改后的图的示意
#ax.xaxis.tick_top()
#ax.tick_params(labeltop=False) # don't put tick labels at the top
#ax2.xaxis.tick_bottom()
plt.setp(ax.get_xticklines(), visible=False)
#下面的代码是破断线的画法,然后d是控制破断线的长短,以下的代码内容,不管使用的什么数据,
#直接复制粘贴就行
d = .015 # how big to make the diagonal lines in axes coordinates
kwargs = dict(transform=ax.transAxes, color='k', clip_on=False)
ax.plot((-d, +d), (-d, +d), **kwargs) # top-left diagonal
ax.plot((1 - d, 1 + d), (-d, +d), **kwargs) # top-right diagonal
kwargs.update(transform=ax2.transAxes) # switch to the bottom axes
ax2.plot((-d, +d), (1 - d, 1 + d), **kwargs) # bottom-left diagonal
ax2.plot((1 - d, 1 + d), (1 - d, 1 + d), **kwargs) # bottom-right diagonal
plt.show()
下面是官网代码画出的图,可以看到底部有这个刻度线很难看:
当我使用plt.setp(ax.get_xticklines(), visible=False)
代替
ax.xaxis.tick_top()
ax.tick_params(labeltop=False) # don't put tick labels at the top
ax2.xaxis.tick_bottom()
有: