Matplotlib轴:将轴对象分成两部分

时间:2017-05-12 01:16:58

标签: python python-3.x matplotlib

我已经开始更多地使用数字和轴了,乍一看它似乎非常好:一个轴对象可以独立创建和操作(通过添加绘图或改变比例/等),但是我遇到的问题是看起来“图”是唯一可以控制轴对象布局的类。

我想做这样的事情:

def plot_side_by_side(lefts, rights, coupled=True, width_ratios=[2,1]):
    import matplotlib.gridspec as gridspec
    # lefts and rights are lists of functions that 
    # take axes objects as keywords, the length of this
    # object is the number of subplots we have:
    plots = list(zip(lefts, rights))
    y_size = len(plots)

    # create figure with a number of subplots:
    fig = plt.figure(figsize=(10,y_size * 4))
    gs = gridspec.GridSpec(y_size,2,width_ratios=width_ratios,height_ratios=[1 for _ in plots])

    #get axes on the left
    cleft_axes = [plt.subplot(gs[0,0])]
    if y_size > 1:
        cleft_axes += [plt.subplot(gs[i,0], sharex=cleft_axes[0]) for i in range(1,y_size)]
    [plt.setp(ax.get_xticklabels(), visible=False) for ax in cleft_axes[:-1]]

    # get axes on the right, if coupled we fix the yaxes
    # together, otherwise we don't
    if coupled:
        yaxes = cleft_axes
    else:
        yaxes = [None for _ in cleft_axes]
    cright_axes = [plt.subplot(gs[0,1], sharey=yaxes[0])]
    if y_size > 1:
        cright_axes += [plt.subplot(gs[i,1], sharey=yaxes[i], sharex=cright_axes[0]) for i in range(1,y_size)]
    [plt.setp(ax.get_xticklabels(), visible=False) for ax in cright_axes[:-1]]

    # for each plot in our list, give it an axes object if it is on
    # the left or right.  Now this function will plot on that axes

    for (pl, pr), l, r, name in zip(plots,cleft_axes,cright_axes,names):
        pl(ax=l)
        pr(ax=r)

    return fig

我希望能够创建一个将轴对象作为关键字并在其上放置两个图的函数:

def twoplots(ax=ax):
    # make a grid of axes, allow them to be plotted to, etc.
    # this is all within the space given me by `ax`.

这可能吗?我怎么去做这样的事情?我知道我可以从传递的轴对象中获取数字,是否可以修改父gridspec而不会弄乱其他每个gridspec?

1 个答案:

答案 0 :(得分:0)

希望我不会因为犯规而犯规。我想对我认为OP试图做的事情提供更多的背景信息。 (至少我希望这是他正在尝试做的事情,因为我正在尝试做同样的事情。)

假设我有一个统计模型,它由不同类型的K个子模型组成。我希望子模型自己绘制。在大多数情况下,在典型情况下,每个子模型都会在轴对象上绘制自己的图。有时,子模型可能需要多个轴来绘制自身。

例如:假设一个模型是一个时间序列模型,并且子模型显示趋势,季节性,回归效应,假日效应等。如果季节性效应显示出年度季节性,它将像趋势模型一样绘制自身(其效果与时间的关系)。但是,如果显示星期几的季节性,则曲线与时间的关系将无效,因为线会太快地摆动。绘制星期一的时间序列,然后绘制星期二的时间序列等会更有效。为了适应更大的方案,您希望将这7个图簇作为“季节性图”。

使用K个子模型,您通常可以从 fig, ax = plt.submodels(K),然后将ax[k]作为model.submodel[k].plot(ax[k])传递给子模型。问题是当您想在ax[k]上绘制上面描述的每周星期几季节性影响时应该怎么做。

一个答案可能是“不要使用这种机制:使用GridSpec或其他东西”。但这就是我想问的问题。