Matplotlib - 在图表中显示坐标轴中断

3
2个回答

4

你已经知道了,brokenaxes包在中断轴方面非常完美,但似乎没有一个已发布的包提供此功能。然而,我已经想出了如何实现你所需要的效果。

首先,在终端中从你的环境目录安装该包:

>>> pip install brokenaxes

或者

>>> conda install -c conda-forge brokenaxes

解决方案:

from brokenaxes import brokenaxes
import numpy as np
import matplotlib.pyplot as plt

x_min    = 0
x_break  = 3
gap      = .1
x_max    = 6

def f(x):
    return np.cos(x)


fig  = plt.figure(figsize=(10,4))
brax = brokenaxes(xlims=((x_min, x_break), (x_break+gap, x_max)), hspace=gap)
xs   = np.linspace(x_min, x_max, 150)

brax.plot(xs, f(xs))
brax.annotate(u'—', (x_break-0.001, f(x_break)), rotation=45, size=25, ha='center', va='center', c='C0')
brax.annotate(u'—', (x_break+gap, f(x_break)), rotation=45, size=25, ha='center', va='center', c='C0')

plt.show()

如果你正在从一个现有的数组中绘图,函数f可以通过从数组中索引来检索这些值。

是的,我也看到了,它很有效,但我仍然看不到在图形本身中包含断点的选项,而不仅仅是在轴上(就像我原始帖子中的示例图中一样)。或者我只是瞎了? - Tintallë
1
我很抱歉 - 我一开始理解你的问题有误。我已删除了最初的回答,并在过去2小时内找到了实现你所寻求的方法。希望这能有所帮助!也许@ben.dichter会觉得这个功能很有用? - foam78
1
感谢您抽出时间!我可以使用您的示例使其正常工作,但是对于我的数据和多个堆叠图来说确实相当繁琐。希望有更简单的解决方案,但我必须像他那样让它正常工作。 - Tintallë

1

使用示例链接 https://matplotlib.org/stable/gallery/subplots_axes_and_figures/broken_axis.html,来实现你的目标:

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(19680801)

# creat data points
x = np.arange(20)+1
pts = x/x

# If we were to simply plot pts, we'd lose most of the interesting
# details due to the outliers. So let's 'break' or 'cut-out' the y-axis
# into two portions - use the top (ax1) for the outliers, and the bottom
# (ax2) for the details of the majority of our data
fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
fig.subplots_adjust(hspace=0.05)  # adjust space between axes

# plot the same data on both axes
ax1.plot(x, pts)
ax2.plot(x, pts)

# zoom-in / limit the view to different portions of the data
ax1.set_xlim(0, 10)  # left part plot
ax2.set_xlim(11, 19)  # right part plot

# hide the spines between ax and ax2
ax1.spines['right'].set_visible(False)
ax2.spines['left'].set_visible(False)
#ax1.xaxis.tick_top()
#ax1.tick_params(labeltop=False)  # don't put tick labels at the top
ax2.yaxis.tick_right()

# Now, let's turn towards the cut-out slanted lines.
# We create line objects in axes coordinates, in which (0,0), (0,1),
# (1,0), and (1,1) are the four corners of the axes.
# The slanted lines themselves are markers at those locations, such that the
# lines keep their angle and position, independent of the axes size or scale
# Finally, we need to disable clipping.

d = .9  # 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([1, 1], [0, 1], transform=ax1.transAxes, **kwargs)
ax2.plot([0, 0], [0, 1], transform=ax2.transAxes, **kwargs)

# add slanted line on the graph
ax1.plot([1], [0.5], transform=ax1.transAxes, **kwargs)
ax2.plot([0], [0.5], transform=ax2.transAxes, **kwargs) 
#fig.savefig('_')

plt.show()

结果如下: 在此输入图片描述

这个问题在于不同轴的范围需要相同,否则缩放就会出现问题。上面的brokenaxes包解决了这个问题,但引入了其他的复杂性。因此,似乎没有一个真正好的方法来解决这个问题... - Tintallë
好的。希望您尽快解决其他的问题。 - ginger21

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接