网格中的三个子图,一个具有共享x和y轴的相等纵横子图

时间:2014-02-27 18:01:25

标签: python matplotlib

我一直在尝试构建一个看起来像an example from the matplotlib gallery的布局,并进行了一些修改:

  • 中心轴应具有“相等”宽高比,但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的结果似乎相同,another implementation of the given exampleAxesDivider相同,但我已确定在{的帮助下我无法使用AxesDivider {1}}因为我还希望在右侧生成append_axes()个轴,并且考虑到实现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(),它很好地处理了颜色条,但这种结构不适合不同的轴刻度,似乎不适用于中轴和右轴组合。

1 个答案:

答案 0 :(得分:1)

这是回答我自己的问题的一种稍微丑陋的方式,我从the first example I referenced攻击了以下代码。这绝对是我想要与更高级别帮手一起处理的事情,所以欢迎其他更短/更清洁的答案。

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')