Подтвердить что ты не робот

Динамически добавлять/создавать подсети в matplotlib

Я хочу создать сюжет, состоящий из нескольких подзаголовков с общими осями x/y. Он должен выглядеть примерно так из документации (хотя мои подзаголовки будут разбросанными): (здесь код)

3 subplots sharing x and y axis

Но я хочу динамически создавать подзаголовки!

Таким образом, количество подзаголовков зависит от выхода предыдущей функции. (Вероятно, это будет примерно от 3 до 15 подзаголовков на каждую диаграмму, каждая из которых отличается от набора данных, в зависимости от ввода моего сценария.)

Может ли кто-нибудь сказать мне, как это сделать?

4b9b3361

Ответ 1

import matplotlib.pyplot as plt
from pylab import *
import numpy as np

x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)

subplots_adjust(hspace=0.000)
number_of_subplots=3

for i,v in enumerate(xrange(number_of_subplots)):
    v = v+1
    ax1 = subplot(number_of_subplots,1,v)
    ax1.plot(x,y)

plt.show()

Этот код работает, но вам нужно будет скорректировать оси. Я использовал subplot для построения трех графиков в одном столбце. Все, что вам нужно сделать, - назначить целое число переменной number_of_plots. Если значения X и Y различаются для каждого графика, вам необходимо назначить их для каждого графика.

subplot работает следующим образом, если, например, у меня были значения подзаголовка 3,1,1. Это создает сетку 3x1 и помещает график в 1-ю позицию. В следующем случае, если мои значения subplot были 3,1,2, он снова создает сетку 3x1, но помещает график во вторую позицию и так далее.

Ответ 2

Основываясь на этом сообщении, то, что вы хотите сделать, это примерно так:

import matplotlib.pyplot as plt

# Start with one
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1,2,3])

# Now later you get a new subplot; change the geometry of the existing
n = len(fig.axes)
for i in range(n):
    fig.axes[i].change_geometry(n+1, 1, i+1)

# Add the new
ax = fig.add_subplot(n+1, 1, n+1)
ax.plot([4,5,6])

plt.show() 

Однако ответ Пола H указывает на подмодуль, называемый gridspec, который может сделать это проще. Я оставляю это как упражнение для читателя ^ _ ~.

Ответ 3

Предположим, вы знаете общие подсети и общие столбцы, которые вы хотите использовать:

import matlab.pyplot as plt

# Subplots are organized in a Rows x Cols Grid
# Tot and Cols are known

Tot = number_of_subplots
Cols = number_of_columns

# Compute Rows required

Rows = Tot // Cols 
Rows += Tot % Cols

# Create a Position index

Position = range(1,Tot + 1)

Первый экземпляр строк Rows только для строк, полностью заполненных подзаголовками, затем добавляется еще один ряд строк, если 1 или 2 или... Cols - 1 подзаголовки все еще нуждаются в местоположении.

Затем создайте фигуру и добавьте подзаголовки с циклом for.

# Create main figure

fig = plt.figure(1)
for k in range(Tot):

  # add every single subplot to the figure with a for loop

  ax = fig.add_subplot(Rows,Cols,Position[k])
  ax.plot(x,y)      # Or whatever you want in the subplot

plt.show()

Обратите внимание, что для перемещения подзаголовков в нужное место вам требуется диапазон Position.

Ответ 4

Вместо того, чтобы подсчитывать собственное количество строк и столбцов, я обнаружил, что проще сначала создать plt.subplots используя plt.subplots, а затем выполнить итерацию по объекту axes для добавления графиков.

import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(12, 8))
x_array = np.random.randn(6, 10)
y_array = np.random.randn(6, 10)

i = 0
for row in axes:
    for ax in row:
        x = x_array[i] 
        y = y_array[i]
        ax.scatter(x, y)
        ax.set_title("Plot " + str(i))
        i += 1
plt.tight_layout()
plt.show()

Здесь я использую я для перебора элементов x_array и y_array, но вы также можете легко перебирать функции или столбцы фреймов данных для динамического генерирования графиков.