Упорядочивайте графики, у которых есть подзаголовки, вызываемые из функций в сетке в matplotlib

Ищу что-то похожее на аранжировку Гроба в R:

У меня есть функция (скажем, функция FUN1), которая создает график с частями. Количество создаваемых подзаговоров FUN1 может варьироваться, а сам сюжет довольно сложен. У меня есть две другие функции FUN2 и FUN3, которые также создают графики различной структуры.

Есть ли простой способ определить / упорядочить общую сетку, например простой стиль 3 строки 1 столбец и просто передать

FUN1 --> GRID(row 1, col 1)
FUN2 --> GRID(row 2, col 1)
FUN3 --> GRID(row 3, col 1)

впоследствии, так что сложный график, сгенерированный FUN1, отображается в строке 1, график, сгенерированный FUN2, в строке 2 и так далее, без указания критериев подзаголовка в FUN ранее?


person Pat    schedule 14.03.2017    source источник
comment
Невозможно разложить неизвестное количество участков на сетке. Вам нужно быть более конкретным в том, чего вы хотите достичь.   -  person ImportanceOfBeingErnest    schedule 14.03.2017


Ответы (1)


Обычный способ создания графиков с помощью matplotlib - сначала создать несколько осей, а затем построить график для этих осей. Оси могут быть установлены на сетке с использованием plt.subplots, figure.add_subplot, plt.subplot2grid или более сложных, с использованием GridSpec.

После создания этих осей их можно передать функциям, которые отображают содержимое осей. Ниже приведен пример создания 6 осей и использования 3 различных функций для их построения.

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np

def func1(ax, bx, cx):
    x = np.arange(3)
    x2 = np.linspace(-3,3)
    y1 = [1,2,4]
    y2 = [3,2.5,3.4]
    f = lambda x: np.exp(-x**2)
    ax.bar(x-0.5, y1, width=0.4)
    ax.bar(x, y2, width=0.4)
    bx.plot(x,y1, label="lab1")
    bx.scatter(x,y2, label="lab2")
    bx.legend()
    cx.fill_between(x2, f(x2))

def func2(ax, bx):
    x = np.arange(1,18)/1.9
    y = np.arange(1,6)/1.4
    z = np.outer(np.sin(x), -np.sqrt(y)).T
    ax.imshow(z, aspect="auto", cmap="Purples_r")
    X, Y = np.meshgrid(np.linspace(-3,3),np.linspace(-3,3))
    U = -1-X**2+Y
    V = 1+X-Y**2
    bx.streamplot(X, Y, U, V, color=U, linewidth=2, cmap="autumn")

def func3(ax):
    data = [sorted(np.random.normal(0, s, 100)) for s in range(2,5)]
    ax.violinplot(data)


gs = gridspec.GridSpec(3, 4, 
                width_ratios=[1,1.5,0.75,1],  height_ratios=[3,2,2] )

ax1 = plt.subplot(gs[0:2,0])
ax2 = plt.subplot(gs[2,0:2])
ax3 = plt.subplot(gs[0,1:3])
ax4 = plt.subplot(gs[1,1])
ax5 = plt.subplot(gs[0,3])
ax6 = plt.subplot(gs[1:,2:])

func1(ax1, ax3, ax5)
func3(ax2)
func2(ax4, ax6)

plt.tight_layout()
plt.show()

введите здесь описание изображения

person ImportanceOfBeingErnest    schedule 14.03.2017
comment
Замечательный ответ. Спасибо за попытку. Я уверен, что это поможет и многим другим людям. - person Pat; 15.03.2017