python显示图片不连续_Python / Matplotlib-有没有办法制作不连续的轴?

I'm trying to create a plot using pyplot that has a discontinuous x-axis. The usual way this is drawn is that the axis will have something like this:

(values)----//----(later values)

where the // indicates that you're skipping everything between (values) and (later values).

I haven't been able to find any examples of this, so I'm wondering if it's even possible. I know you can join data over a discontinuity for, eg, financial data, but I'd like to make the jump in the axis more explicit. At the moment I'm just using subplots but I'd really like to have everything end up on the same graph in the end.

解决方案

Paul's answer is a perfectly fine method of doing this.

However, if you don't want to make a custom transform, you can just use two subplots to create the same effect.

Rather than put together an example from scratch, there's an excellent example of this written by Paul Ivanov in the matplotlib examples (It's only in the current git tip, as it was only committed a few months ago. It's not on the webpage yet.).

This is just a simple modification of this example to have a discontinuous x-axis instead of the y-axis. (Which is why I'm making this post a CW)

Basically, you just do something like this:

import matplotlib.pylab as plt

import numpy as np

# If you're not familiar with np.r_, don't worry too much about this. It's just

# a series with points from 0 to 1 spaced at 0.1, and 9 to 10 with the same spacing.

x = np.r_[0:1:0.1, 9:10:0.1]

y = np.sin(x)

fig,(ax,ax2) = plt.subplots(1, 2, sharey=True)

# plot the same data on both axes

ax.plot(x, y, 'bo')

ax2.plot(x, y, 'bo')

# zoom-in / limit the view to different portions of the data

ax.set_xlim(0,1) # most of the data

ax2.set_xlim(9,10) # outliers only

# 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(labeltop='off') # don't put tick labels at the top

ax2.yaxis.tick_right()

# Make the spacing between the two axes a bit smaller

plt.subplots_adjust(wspace=0.15)

plt.show()

To add the broken axis lines // effect, we can do this (again, modified from Paul Ivanov's example):

import matplotlib.pylab as plt

import numpy as np

# If you're not familiar with np.r_, don't worry too much about this. It's just

# a series with points from 0 to 1 spaced at 0.1, and 9 to 10 with the same spacing.

x = np.r_[0:1:0.1, 9:10:0.1]

y = np.sin(x)

fig,(ax,ax2) = plt.subplots(1, 2, sharey=True)

# plot the same data on both axes

ax.plot(x, y, 'bo')

ax2.plot(x, y, 'bo')

# zoom-in / limit the view to different portions of the data

ax.set_xlim(0,1) # most of the data

ax2.set_xlim(9,10) # outliers only

# 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(labeltop='off') # don't put tick labels at the top

ax2.yaxis.tick_right()

# Make the spacing between the two axes a bit smaller

plt.subplots_adjust(wspace=0.15)

# 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) # top-left diagonal

ax.plot((1-d,1+d),(1-d,1+d), **kwargs) # bottom-left diagonal

kwargs.update(transform=ax2.transAxes) # switch to the bottom axes

ax2.plot((-d,d),(-d,+d), **kwargs) # top-right diagonal

ax2.plot((-d,d),(1-d,1+d), **kwargs) # bottom-right diagonal

# 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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值
>