我一直在尝试构建一个布局,它看起来像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')