在matplotlib的x轴上断开// [英] Break // in x axis of matplotlib
问题描述
描述我想要实现的最好方法是使用自己的图像:
Best way to describe what I want to achieve is using my own image:
现在我在光谱图中有很多死角,尤其是在5200和6300之间.我的问题很简单,我如何添加一个类似//的漂亮的小//中断(图像从净):
Now I have a lot of dead space in the spectra plot, especially between 5200 and 6300. My question is quite simple, how would I add in a nice little // break that looks something similar to this (image lifted from the net):
我正在使用此设置进行绘图:
I'm using this setup for my plots:
nullfmt = pyplot.NullFormatter()
fig = pyplot.figure(figsize=(16,6))
gridspec_layout1= gridspec.GridSpec(2,1)
gridspec_layout1.update(left=0.05, right=0.97, hspace=0, wspace=0.018)
pyplot_top = fig.add_subplot(gridspec_layout1[0])
pyplot_bottom = fig.add_subplot(gridspec_layout1[1])
pyplot_top.xaxis.set_major_formatter(nullfmt)
我敢肯定,使用gridpsec可以实现这一点,但是非常感谢您详细了解如何实现此目标的高级教程.
I'm quite certain it is achievable with gridpsec but an advanced tutorial cover exactly how this is achieved would be greatly appreciated.
很抱歉,如果以前在stackoverflow上已经解决了这个问题,但是我已经广泛地研究了gridSpec
的正确过程,但至今没有发现任何问题.
Apologies also if this question has been dealt with previously on stackoverflow but I have looked extensively for the correct procedure for gridSpec
but found nothing as yet.
我已经设法做到了这一点,几乎在那里:
I have managed to go as far as this, pretty much there:
但是,我的折断线没有我想要的陡峭...如何更改它们? (我使用了下面的示例答案)
However, my break lines are not as steep as I would like them...how do I change them? (I have made use of the example answer below)
推荐答案
您可以改写 matplotlib示例直接在x轴上断开:
You could adapt the matplotlib example for a break in the x-axis directly:
"""
Broken axis example, where the x-axis will have a portion cut out.
"""
import matplotlib.pylab as plt
import numpy as np
x = np.linspace(0,10,100)
x[75:] = np.linspace(40,42.5,25)
y = np.sin(x)
f,(ax,ax2) = plt.subplots(1,2,sharey=True, facecolor='w')
# plot the same data on both axes
ax.plot(x, y)
ax2.plot(x, y)
ax.set_xlim(0,7.5)
ax2.set_xlim(40,42.5)
# hide the spines between ax and ax2
ax.spines['right'].set_visible(False)
ax2.spines['left'].set_visible(False)
ax.yaxis.tick_left()
ax.tick_params(labelright='off')
ax2.yaxis.tick_right()
# This looks pretty good, and was fairly painless, but you can get that
# cut-out diagonal lines look with just a bit more work. The important
# thing to know here is that in axes coordinates, which are always
# between 0-1, spine endpoints are at these locations (0,0), (0,1),
# (1,0), and (1,1). Thus, we just need to put the diagonals in the
# appropriate corners of each of our axes, and so long as we use the
# right transform and disable clipping.
d = .015 # how big to make the diagonal lines in axes coordinates
# arguments to pass plot, just so we don't keep repeating them
kwargs = dict(transform=ax.transAxes, color='k', clip_on=False)
ax.plot((1-d,1+d), (-d,+d), **kwargs)
ax.plot((1-d,1+d),(1-d,1+d), **kwargs)
kwargs.update(transform=ax2.transAxes) # switch to the bottom axes
ax2.plot((-d,+d), (1-d,1+d), **kwargs)
ax2.plot((-d,+d), (-d,+d), **kwargs)
# What's cool about this is that now if we vary the distance between
# ax and ax2 via f.subplots_adjust(hspace=...) or plt.subplot_tool(),
# the diagonal lines will move accordingly, and stay right at the tips
# of the spines they are 'breaking'
plt.show()
出于您的目的,只需两次绘制数据(在每个轴上分别ax
和ax2
并设置xlim
即可.中断线"应移动以匹配新的中断,因为它们已绘制相对轴坐标而不是数据坐标.
For your purposes, just plot your data twice (once on each axis, ax
and ax2
and set your xlim
s appropriately. The "break lines" should move to match the new break because they are plotted in relative axis coordinates rather than data coordinates.
折线只是在一对点之间绘制的未剪裁的绘图线.例如. ax.plot((1-d,1+d), (-d,+d), **kwargs)
在第一个轴上绘制点(1-d,-d)
和(1+d,+d)
之间的折线:这是右下角的点.如果您想更改原图,请适当更改这些值.例如,要使其陡峭,请尝试ax.plot((1-d/2,1+d/2), (-d,+d), **kwargs)
The break lines are just unclipped plot lines drawn between a pair of points. E.g. ax.plot((1-d,1+d), (-d,+d), **kwargs)
plots the break line between point (1-d,-d)
and (1+d,+d)
on the first axis: this is the bottom righthand one. If you want to change the graident, change these values appropriately. For example, to make this one steeper, try ax.plot((1-d/2,1+d/2), (-d,+d), **kwargs)
这篇关于在matplotlib的x轴上断开//的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!