Добавление подзаговоров к рисунку с использованием цикла for - PullRequest
1 голос
/ 09 апреля 2020

Я пытаюсь добавить 8 тепловых карт (подпланов) к фигуре, но я не могу справиться с этим. Не могли бы вы мне помочь?

# in order to modify the size
fig = plt.figure(figsize=(12,8))
# adding multiple Axes objects  
fig, ax_lst = plt.subplots(2, 4)  # a figure with a 2x4 grid of Axes

letter = "ABCDEFGH"

for character in letter:
    x = np.random.randn(4096)
    y = np.random.randn(4096)
    heatmap, xedges, yedges = np.histogram2d(x, y, bins=(64,64))
    extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]

    # Plot heatmap
    plt.clf()
    plt.title('Pythonspot.com heatmap example')
    plt.ylabel('y')
    plt.xlabel('x')
    plt.imshow(heatmap, extent=extent)
    plt.colorbar()
    plt.show()

Спасибо!

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Сначала вы создавали две отдельные фигуры, вызывая plt.figure(), а затем plt.subplots() (эта последняя функция создает и фигуру, и массив осей)

Затем вам нужно выполнить итерацию по вашим осям, и нанесите на каждую из этих осей вместо очистки фигуры на каждом l oop (что вы и делали, используя plt.clf())

Вы можете использовать функции plt.XXXX(), но они работают только на «текущих» осях, поэтому вы должны менять текущие оси на каждой итерации. В противном случае вам лучше использовать функции Axes.set_XXXX(), как в другом ответе @yatu. См. здесь для получения дополнительной информации . fig, ax_lst = plt.subplots (2, 4, figsize = (12,8)) # фигура с сеткой осей 2x4

letters = "ABCDEFGH"
for character,ax in zip(letters, ax_lst.flat):
    x = np.random.randn(4096)
    y = np.random.randn(4096)
    heatmap, xedges, yedges = np.histogram2d(x, y, bins=(64,64))
    extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]

    # Plot heatmap
    plt.sca(ax) # make the ax object the "current axes"
    plt.title(character)
    plt.ylabel('y')
    plt.xlabel('x')
    plt.imshow(heatmap, extent=extent)
    plt.colorbar()
plt.show()
1 голос
/ 09 апреля 2020

Подобно этому ответу , вы можете сделать следующее:

letter = "ABCDEFGH"

n_cols = 2
fig, axes = plt.subplots(nrows=int(np.ceil(len(letter)/n_cols)), 
                         ncols=n_cols, 
                         figsize=(15,15))

for _, ax in zip(letter, axes.flatten()):
    x = np.random.randn(4096)
    y = np.random.randn(4096)
    heatmap, xedges, yedges = np.histogram2d(x, y, bins=(64,64))
    extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]

    # Plot heatmap
    ax.set_title('Pythonspot.com heatmap example')
    ax.set_ylabel('y')
    ax.set_xlabel('x')
    ax.imshow(heatmap, extent=extent)
plt.tight_layout()  
plt.show()

enter image description here

...