2016-05-24 2 views
0

Я хотел бы сопоставить два отдельных участка в matplotlib на том же рисунке. каждая часть сюжета вызывает subplot, и я бы хотел, чтобы их оси были независимыми. Пример: я хочу противопоставлять два участка, один из которых делает 1x3 сюжетные, а другой, что делает 2х2 сюжетные, в том же рисунке:Создание независимых графиков matplotlib на одной фигуре без GridSpec?

import matplotlib.pylab as plt 

def plot_A(): 
    # make a set of subplots here... 
    plt.subplot(1, 3, 1) 
    plt.subplot(1, 3, 2) 
    plt.subplot(1, 3, 3)  

def plot_B(): 
    # make a set of independent subplots here 
    plt.subplot(2, 2, 1) 
    plt.subplot(2, 2, 2) 
    plt.subplot(2, 2, 3) 
    plt.subplot(2, 2, 4) 

def make_fig(): 
    width = 6. 
    height = 5. 
    fig = plt.figure(figsize=(width, height)) 
    ratio = height/width 
    ax1 = fig.add_axes([.03 * ratio, .03, .9 * ratio, .9]) 
    # make plot A 
    plot_A() 
    ax1 = fig.add_axes([.03 * ratio, .01, .9 * ratio, .9/2.5]) 
    # make plot B below plot A in the figure, with 
    # space constraints given by fig.add_axes 
    plot_B() 
    plt.show() 

make_fig() 

это не работает, потому что сюжетные заезжает plot_B переопределения в plot_A , Я знаю, что gridspec может использоваться для создания единого макета, который содержит оба, но я не могу использовать это. plot_A и plot_B могут быть функциями, которые находятся в отдельных модулях, и могут быть вызваны, чтобы сделать отдельные фигуры независимыми от make_fig().

обновление: решение заключается в использовании нескольких гридов с gridspec.update, чтобы разместить их в разных местах на рисунке.

+0

Любопытно, почему вы не хотите использовать 'plt.GridSpec', это похоже на правильный инструмент здесь. – mwaskom

+0

@mwaskom: потому что gridspec заставляет меня сломать модульную модульность, создав глобальный gridspec, который учитывает как '' plot_A() ', так и' 'plot_B()' '. но эти две функции делают подзаголовки, которые также используются для создания отдельных фигур только A или просто B. с gridspec, я должен был бы создать новую функцию, которая воспроизводит код '' plot_A() '' и '' plot_B() ' ' – mvd

+0

Вы можете использовать несколько объектов GridSpec на одной фигуре, поэтому я не уверен, что вы имеете в виду. – mwaskom

ответ

0

Ваша проблема заключается в том, что ваши подзадачи разделяют одно и то же пространство.

Выберите делянок, которые не пересекаются, и вы должны быть хорошо:

import matplotlib.pyplot as pl 
def plot1(): 
    pl.subplot(3,3,1); pl.plot(1); 
    pl.subplot(3,3,2); pl.plot(2); 
    pl.subplot(3,3,3); pl.plot(3); 
def plot2(): 
    pl.subplot(3,2,3); pl.plot(4); 
    pl.subplot(3,2,4); pl.plot(4); 
    pl.subplot(3,2,5); pl.plot(4); 
    pl.subplot(3,2,6); pl.plot(4); 

plot1() 
plot2() 
pl.show() 

Другой вариант:

def plot1b(): 
    pl.subplot(3,6,(1,2)); pl.plot(1); 
    pl.subplot(3,6,(3,4)); pl.plot(2); 
    pl.subplot(3,6,(5,6)); pl.plot(3); 
def plot2b(): 
    pl.subplot(3,6,(7,9)); pl.plot(4); 
    pl.subplot(3,6,(10,12)); pl.plot(4); 
    pl.subplot(3,6,(13,15)); pl.plot(4); 
    pl.subplot(3,6,(16,18)); pl.plot(4); 

plot1b() 
plot2b() 
pl.show() 
0

правильный ответ, как указывал @mwaskom является использование нескольких gridspecs и использования gridspec.update, чтобы разместить их в разных частях фигуры.

Смежные вопросы