matplotlib 在子图中创建断轴 [英] matplotlib create broken axis in subplot

查看:59
本文介绍了matplotlib 在子图中创建断轴的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个有问题的子图,其中包含两个数据规模.我不想使用对数刻度,而是要断开轴,以便子图y轴的一半从0到10,另一半从10到100.

I have a problematic subplot that has two scales of data. Instead of using a log scale, I want to break the axis, so that half of the subplot y axis runs from 0 to 10 and the other half from 10 to 100.

import numpy as np
import matplotlib.pyplot as plt
x = np.random.uniform(0, 10, 40)
y = np.concatenate([np.random.uniform(0, 1, 30), np.random.uniform(0, 100, 10)])
y2 = np.random.uniform(0, 1, 40) 
fig, ax = plt.subplots(2, sharex=True)
ax[0].scatter(x, y) # problematic subplot
ax[1].scatter(x, y2)
plt.show()

我尝试遵循 pyplot 的断轴演示,尽管这似乎是错误的.我是否需要总共创建四个子图才能做到这一点?这只是一个虚拟示例,我的真正问题有几个子图,其中许多都需要这些断轴.

I tried following pyplot's broken axis demo, though this seems wrong. Do I need to create a total of four subplots to do this? This is just a dummy example, my real problem has several subplots, many of which need these broken axis.

import numpy as np
import matplotlib.pyplot as plt
x = np.random.uniform(0, 10, 40)
y = np.concatenate([np.random.uniform(0, 1, 30), np.random.uniform(0, 100, 10)])
y2 = np.random.uniform(0, 1, 40) 

fig, ax = plt.subplots(4, sharex=True)

# Create broken axis with first two subplots
ax[0].scatter(x, y)
ax[1].scatter(x, y)
ax[0].set_ylim(1, 100)
ax[1].set_ylim(0, 1)
ax[0].spines['bottom'].set_visible(False)
ax[1].spines['top'].set_visible(False)

# From https://matplotlib.org/examples/pylab_examples/broken_axis.html
d = .015  # how big to make the diagonal lines in axes coordinates
# arguments to pass to plot, just so we don't keep repeating them
kwargs = dict(transform=ax[0].transAxes, color='k', clip_on=False)
ax[0].plot((-d, +d), (-d, +d), **kwargs)        # top-left diagonal
ax[0].plot((1 - d, 1 + d), (-d, +d), **kwargs)  # top-right diagonal

kwargs.update(transform=ax[1].transAxes)  # switch to the bottom axes
ax[0].plot((-d, +d), (1 - d, 1 + d), **kwargs)  # bottom-left diagonal
ax[0].plot((1 - d, 1 + d), (1 - d, 1 + d), **kwargs)  # bottom-right diagonal



# Try my best to fix bottom two plots so they look like one plot
ax[2].scatter(x, y2)
ax[3].scatter(x, y2)
ax[2].set_ylim(.5, 1.0)
ax[3].set_ylim(0, .5)
ax[2].spines['bottom'].set_visible(False)
ax[3].spines['top'].set_visible(False)
plt.savefig('ex.pdf')

推荐答案

我可能建议仅使用两个子图,一个在顶部,一个在底部.然后,通过 mpl_toolkits.axes_grid1.make_axes_locatable 将上面的一分为二.

I might suggest to use only two subplots, one at the top and one at the bottom. Then, divide the upper one into two via mpl_toolkits.axes_grid1.make_axes_locatable.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable


x = np.random.uniform(0, 10, 40)
y = np.concatenate([np.random.uniform(0, 1, 30), np.random.uniform(0, 100, 10)])
y2 = np.random.uniform(0, 1, 40) 

fig, axes = plt.subplots(nrows=2, sharex=True)

ax = axes[0]
divider = make_axes_locatable(ax)
ax2 = divider.new_vertical(size="100%", pad=0.1)
fig.add_axes(ax2)

ax.scatter(x, y)
ax.set_ylim(0, 1)
ax.spines['top'].set_visible(False)
ax2.scatter(x, y)
ax2.set_ylim(10, 100)
ax2.tick_params(bottom=False, labelbottom=False)
ax2.spines['bottom'].set_visible(False)


# From https://matplotlib.org/examples/pylab_examples/broken_axis.html
d = .015  # how big to make the diagonal lines in axes coordinates
# arguments to pass to plot, just so we don't keep repeating them
kwargs = dict(transform=ax2.transAxes, color='k', clip_on=False)
ax2.plot((-d, +d), (-d, +d), **kwargs)        # top-left diagonal
ax2.plot((1 - d, 1 + d), (-d, +d), **kwargs)  # top-right diagonal

kwargs.update(transform=ax.transAxes)  # switch to the bottom axes
ax.plot((-d, +d), (1 - d, 1 + d), **kwargs)  # bottom-left diagonal
ax.plot((1 - d, 1 + d), (1 - d, 1 + d), **kwargs)  # bottom-right diagonal


#create bottom subplot as usual
axes[1].scatter(x, y2)


plt.show()

这篇关于matplotlib 在子图中创建断轴的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆