网格中的三个子图形,一个具有共享x和y轴的等宽子图形



我一直在尝试构建一个布局,它看起来像matplotlib库中的一个示例,并进行了一些修改:

  • 中心轴应具有"相等"的纵横比,但xlim != ylim
  • 顶部轴将为中心轴中的数据放置一个颜色条
  • 右侧轴将容纳twiny()设置

当我希望随着中心轴的x和y极限可能发生变化而动态执行时,引用的示例似乎会在轴的位置进行硬编码。

我尝试过不同的方法,但我将首先介绍一个使用add_sublot()的方法。

中心轴可以用类似的东西制作(预计使用AxisDivider添加顶部轴,从而添加121):

from matplotlib.pyplot import *
fig = gcf()
ax_c = fig.add_subplot(121,aspect='equal',xlim=[0,2],ylim=[0,0.5])
draw()

从而产生预期的结果。(这是我第一次使用StackExchange,所以我还没有发布图片或两个以上链接的10名声誉。)很好。但当我添加第二个子图时,比如:

ax_r = fig.add_subplot(122,sharey=ax_c,xlim=[0,4])
draw()

纵横比被破坏,最初设置的x限制也是如此。

使用GridSpec的结果似乎是相同的,并且还有另一个使用AxesDivider的给定示例的实现,但我已经确定,我不能在append_axes()的帮助下使用AxesDivider,因为我也想在右边生成twiny()轴,并且考虑到twiny()AxesGrid的实现方式,twiny()轴最终跨越了整个图形。

fig.clf()
from mpl_toolkits.axes_grid1 import make_axes_locatable
import numpy as np
ax_c = fig.add_subplot(111,aspect='equal',xlim=[0,2],ylim=[0,0.5])
divider = make_axes_locatable(ax_c)
ax_r = divider.append_axes("right", size=1.3, pad=0.1, sharey=ax_c)
ax_rty = ax_r.twiny()
draw()

我认为颜色条,即所需的跨越中心轴宽度的顶部轴,可以用make_axes_locatable()方法实现。我也尝试过AxesGrid,它可以很好地处理颜色条,但这种结构不适合不同的轴比例,而且似乎不适用于中轴和右轴的组合。

这是回答我自己问题的一种略显丑陋的方式,我从我引用的第一个例子中破解了以下代码。这肯定是我想与更高级别的助手一起处理的事情,所以欢迎其他更短/更干净的答案。

import numpy as np
import matplotlib.pyplot as plt
xlim = (-60.,60.)
ylim = (-110.,110.)
axes_pad = 0.02
cbar_height = 0.025
h_pad = 0.1
v_pad = 0.1
fig_w = 7.
fig_h = 6.
height = 1-axes_pad-cbar_height-2*v_pad
width = np.abs((xlim[1]-xlim[0])/(ylim[1]-ylim[0]))*height*fig_h/fig_w # ensure equal aspect
bottom_h = v_pad+height+axes_pad
left_h = h_pad+width+axes_pad
rect_c = [h_pad, v_pad, width, height]
rect_cbar = [h_pad, bottom_h, width, cbar_height]
rect_r = [left_h, v_pad, 1-axes_pad-width-2*h_pad, height]
fig = plt.figure(1, figsize=(fig_w,fig_h))
ax_c = plt.axes(rect_c)
ax_cbar = plt.axes(rect_cbar)
ax_r = plt.axes(rect_r)
ax_c.set_xlim(xlim)
ax_c.set_ylim(ylim)
ax_r.set_ylim(ylim)
ax_rty = ax_r.twiny()
ax_rty.set_xlim((-100,0)) # determined dynamically later
ax_r.set_xlim((0,0.5)) # determined dynamically later
plt.savefig('skeleton.pdf',bbox_inches='tight')

相关内容

最新更新