【问题标题】:How to use sharex and sharey combined with aspect=equal and adjustable='box-forced' to create subplots with the same scale in matplotlib?如何使用sharex和sharey结合aspect=equal和adjustable='box-forced'在matplotlib中创建相同比例的子图?
【发布时间】:2017-11-17 13:35:19
【问题描述】:

我正在尝试创建四个子图,其轴代表不同方向上的不同距离范围 [km],但右下角子图的 x 轴表示计数。在所有子图中,所有距离轴都应具有相同的比例。此外,顶部的两个子图应共享其 y 轴,左侧的两个子图应共享其 x 轴。

按照issue(其解决方案适用于 x 轴和 y 轴的相等限制),我尝试了 sharex、sharey、aspect 和可调参数的几种组合,但均未成功。

有没有办法实现这种绘图,尤其是在不影响任何轴限制的情况下?

这是我的 MCVE:

import matplotlib.pyplot as plt
lim1 = [0.,30.]
lim2 = [0.,15.]
lim3 = [0.,75.]
lim4 = [0,5]
xdat = [12.,25.]
ydat = [6.,12.]
zdat = [50.,25.]
cdat = [1,1]
fig = plt.figure()
ax1 = plt.subplot(221,aspect='equal',adjustable='box-forced')
ax1.plot(xdat,ydat,'o')
ax1.set_xlim(lim1)
ax1.set_ylim(lim2)
ax2 = plt.subplot(222,aspect='equal',adjustable='box-forced',sharey=ax1)
ax2.plot(zdat,ydat,'o') 
ax2.set_xlim(lim3)
ax3 = plt.subplot(223,aspect='equal',adjustable='box-forced',sharex=ax1)
ax3.plot(xdat,zdat,'o')
ax3.set_ylim(lim3)
ax4 = plt.subplot(224)
ax4.plot(cdat,zdat,'o')
ax4.set_xlim(lim4)
ax4.set_ylim(lim3)
plt.show()

我想得到类似于下图中的图,它显示了我上面提到的共享轴,保持原始轴限制和不同距离轴上的相同比例。

我目前正在使用:
平台:Linux Ubuntu 14.04.5 LTS
matplotlib:1.5.1
蟒蛇:2.7.14

【问题讨论】:

  • 我猜“相同比例”确实会过度约束系统。除了代码按预期工作,那么您希望情节看起来如何?
  • @ImportanceOfBeingErnest “过度约束系统”是什么意思?顺便说一句,我刚刚更新了我的问题,包括一张关于情节应该是什么样子的图像。
  • 您显示的图的纵横比不相等。因此,如果您删除有关相等方面的约束,则绘图看起来很好。
  • @ImportanceOfBeingErnest 该图没有相等的纵横比,因为我删除了该约束(aspect='equal'),只是为了显示应如何共享子图轴。但我需要该约束以在子图轴上保持相同的比例。
  • 可以画出你想象中的情节的样子吗?

标签: python matplotlib


【解决方案1】:

您想要更改底层网格以使图具有不同的大小。不同的限制将作为网格单元大小之间的比率。

然后您仍然需要调整图形大小以具有良好的间距并设置最后一个子图的纵横比而不是 1。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec

lim1 = [0.,30.]
lim2 = [0.,15.]
lim3 = [0.,75.]
lim4 = [0,5]
xdat = [12.,25.]
ydat = [6.,12.]
zdat = [50.,25.]
cdat = [1,1]

gskw = dict(width_ratios = [np.diff(lim1)[0],np.diff(lim3)[0]],
            height_ratios= [np.diff(lim2)[0],np.diff(lim3)[0]])

gs = matplotlib.gridspec.GridSpec(2,2, **gskw)

fig = plt.figure(figsize=(6,5))

ax1=fig.add_subplot(gs[0,0], aspect="equal",adjustable='box-forced')
ax1.plot(xdat,ydat,'o')

ax2=fig.add_subplot(gs[0,1], aspect="equal",adjustable='box-forced', sharey=ax1)
ax2.plot(zdat,ydat,'o') 

ax3=fig.add_subplot(gs[1,0], aspect="equal",adjustable='box-forced', sharex=ax1)
ax3.plot(xdat,zdat,'o')

asp, = np.diff(lim4)/np.diff(lim3)
ax4=fig.add_subplot(gs[1,1], aspect=asp)
ax4.plot(cdat,zdat,'o')

ax1.set_xlim(lim1)
ax1.set_ylim(lim2)
ax2.set_xlim(lim3)
ax3.set_ylim(lim3)
ax4.set_xlim(lim4)
ax4.set_ylim(lim3)

plt.show()

【讨论】:

  • 谢谢!这正是我一直在寻找的。​​span>
猜你喜欢
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多