「—matplotlib 绘制 x、y 轴截断图」 内容概要想要在一个图形上形象地展示两个数量级差别较大的数据的变化趋势时,上期介绍的双 y 轴图Python可视化:双y轴图/R语言可视化:双y轴图,是一种很好的可视化方法,它能确保某个变量的变化趋势不会被另一个变量所影响。而当同一类型数据中存在差别较大的极端值时,使用坐标轴截断的可视化方法,可排除极端值对其他数据整体变化趋势的影响。 本期内容将介绍两种方法绘制 x、y 轴截断图,分别为只使用 matplotlib 库的方法,以及使用 matplotlib+brokenaxes 库的方法。需要本案例数据和完整代码的于公众号后台回复「20221201」即可。 matplotlib方法只使用matplotlib库便可实现x、y轴截断图形的绘制。该方法的优点是绘制图形的可自定义性强,便于后续调整图形整体的细节和美观,缺点是相对于第二种方法而言,其代码量偏多。 绘制y轴截断图的代码及其详细注释: import numpy as np import matplotlib.pyplot as plt
np.random.seed(19680801)
# 创建用于绘制图片的30个处于0到0.2之间的随机数据点 pts = np.random.rand(30)*0.2
# 在原始数据点中创建两个离群数据点 pts[[3, 14]] += 0.8
# 创建两个绘图坐标轴;调整两个轴之间的距离,即轴断点距离 fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True) fig.subplots_adjust(hspace=0.05) # adjust space between axes
# 将用相同的绘图数据,在两个轴上绘制折线图 ax1.plot(pts) ax2.plot(pts)
# 调整两个y轴的显示范围 ax1.set_ylim(.78, 1.) # outliers only ax2.set_ylim(0, .22) # most of the data
# 隐藏两个坐标轴系列之间的横线 ax1.spines.bottom.set_visible(False) ax2.spines.top.set_visible(False) ax1.xaxis.tick_top()
# 隐藏y轴刻度 ax1.tick_params(axis='x',length=0) # ax2.xaxis.tick_bottom()
# 添加网格线 ax1.grid(ls='--',alpha=0.5,linewidth=1) ax2.grid(ls='--',alpha=0.5,linewidth=1)
# 创建轴断刻度线,d用于调节其偏转角度 d = 0.5 # proportion of vertical to horizontal extent of the slanted line kwargs = dict(marker=[(-1, -d), (1, d)], markersize=12, linestyle='none', color='k', mec='k', mew=1, clip_on=False) ax1.plot([0, 1], [0, 0], transform=ax1.transAxes, **kwargs) ax2.plot([0, 1], [1, 1], transform=ax2.transAxes, **kwargs)
plt.savefig('1.broken_yaxis.png', dpi=600, bbox_inches='tight') plt.show()
输出的y轴截断图: 绘制x轴截断图的代码及其详细注释: import numpy as np import matplotlib.pyplot as plt
# 创建用于绘制图片的30个处于0到0.2之间的随机数据点 np.random.seed(19680801) pts = np.random.rand(30)*.2
# 在原始数据点中创建两个离群数据点 pts[[3, 14]] += .8
# 创建两个绘图坐标轴;调整两个轴之间的距离,即轴断点距离 fig, (ax1, ax2) = plt.subplots(1, 2, sharey='all') fig.subplots_adjust(wspace=0.05)
# 将用相同的绘图数据,在两个轴上绘制折线图 ax1.plot(pts,np.arange(0,30)) ax2.plot(pts,np.arange(0,30))
# 调整两个x轴的显示范围 ax2.set_xlim(0.78, 1.0) # outliers only ax1.set_xlim(0, .22) # most of the data
# 隐藏两个坐标轴系列之间的横线 ax1.spines.right.set_visible(False) ax2.spines.left.set_visible(False)
# 隐藏y轴刻度 ax2.tick_params(axis='y',length=0) # 隐藏y轴刻度 # ax2.xaxis.tick_bottom() # 添加网格线 ax1.grid(ls='--',alpha=0.5,linewidth=1) ax2.grid(ls='--',alpha=0.5,linewidth=1)
# 创建轴断刻度线,d用于调节其偏转角度 d = 0.5 kwargs = dict(marker=[(-1, -d), (1, d)], markersize=10,linestyle='none',color='k', mec='k', mew=1, clip_on=False) ax1.plot([1, 1], [1, 0], transform=ax1.transAxes, **kwargs) ax2.plot([0, 0], [0, 1], transform=ax2.transAxes, **kwargs)
# 保存、输出绘制的图片 plt.savefig('2.broken_xaxis.png', dpi=600,bbox_inches='tight') plt.show()
输出的x轴截断图:
matplotlib+brokenaxes方法使用matplotlib库结合brokenaxes库,可实现对坐标轴截断图的绘制,相较于第一种方法而言,该方法绘图代码量少,但对图形的自定义性较差。在使用brokenaxes 第三方库之前,需要手动将其安装,使用pip的安装方法如下: pip install brokenaxes
绘制y轴截断图的代码及其详细注释: import numpy as np import matplotlib.pyplot as plt from brokenaxes import brokenaxes
np.random.seed(19680801)
pts = np.random.rand(30)*.2 pts[[3, 14]] += .8
fig = plt.figure(figsize=(8,6))
# 使用brokenaxes函数创建绘图坐标轴体系,ylim参数中输入断点两侧轴范围, # despine参数控制是否显示上轴和右轴,hspace参数控制断点截断线之间的宽度,d控制断点截断线的长度 ax = brokenaxes(ylims=((0, 0.22), (0.78, 1.0)),despine=False, hspace=0.05,d=0.01) ax.plot(pts) ax.grid(ls='--',alpha=0.5,linewidth=1)
plt.savefig('3.broken_yaxis.png', dpi=600,bbox_inches='tight') plt.show()
输出的y轴截断图: 绘制x轴截断图的代码及其详细注释: import numpy as np import matplotlib.pyplot as plt from brokenaxes import brokenaxes
np.random.seed(19680801)
pts = np.random.rand(30)*.2 y = np.arange(0,30) pts[[3, 14]] += .8
fig = plt.figure(figsize=(8,6)) ax = brokenaxes(xlims=((0, 0.22), (0.78, 1.0)),despine=False, wspace=0.05,d=0.01) ax.plot(pts,y) ax.grid(ls='--',alpha=0.5,linewidth=1)
plt.savefig('4.broken_xaxis.png', dpi=600, bbox_inches='tight') plt.show()
输出的x轴截断图:
|