matplotlib的断轴实现原理和代码详解

问题

关于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()

有:
在这里插入图片描述

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Matplotlib是指在绘制图表时,当某些变量的数量级远大于其他变量时,为了将它们放在同一张图中,需要对坐标进行截Matplotlib没有直接提供这个功能,但可以通过一些技巧实现。其中一种方法是使用mpl_toolkits.axes_grid1库中的make_axes_locatable函数来创建一个新的坐标,并将其放置在原始坐标的位置上,然后在新的坐标上绘制数据。这样就可以实现的效果。 举个例子,如果我们要绘制一组数据,其中有一个变量的数量级远大于其他变量,我们可以使用Matplotlib功能来将其放在同一张图中。具体步骤如下: ```python import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import make_axes_locatable # 生成数据 x = [1, 2, 3, 4, 5] y1 = [10, 20, 30, 40, 50] y2 = [1000, 2000, 3000, 4000, 5000] # 创建画布和子图 fig, ax = plt.subplots() # 绘制数据 ax.plot(x, y1) ax.set_ylabel('y1') # 创建新的坐标 divider = make_axes_locatable(ax) ax2 = divider.append_axes("bottom", size="30%", pad=0.1) # 绘制数据 ax2.plot(x, y2) ax2.set_ylabel('y2') # 设置坐标范围 ax.set_ylim(0, 60) ax2.set_ylim(900, 5500) # 显示图形 plt.show() ``` 在这个例子中,我们使用make_axes_locatable函数创建了一个新的坐标,并将其放置在原始坐标的下方。然后在新的坐标上绘制了另一组数据。最后,我们通过设置坐标的范围来实现的效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月司

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值