我一直在尝试构建一个看起来像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 example与AxesDivider
相同,但我已确定在{的帮助下我无法使用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()
,它很好地处理了颜色条,但这种结构不适合不同的轴刻度,似乎不适用于中轴和右轴组合。
答案 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')