Расположение легенды в сюжете matplotlib - PullRequest
1 голос
/ 02 апреля 2019

Я пытаюсь создать подсюжеты на сетке (6X3).У меня проблема с расположением легенды.Легенда является общей для всего сюжета.Теперь легенда перекрывается с меткой оси Y

. Я попытался удалить опцию constrained_layout = True.Но это сохраняет много пустого пространства между легендой и сюжетами.

import numpy as np
import matplotlib.pyplot as plt
#plt.rcParams["font.family"] = "Times New Roman"
#plt.rcParams.update({'font.size': 12})

font = {'family' : 'Times New Roman',
        'size'   : 14}  
plt.rc('font', **font)


t = np.linspace(0,10, num=200)
fig, axs = plt.subplots(6, 3, figsize=(12,16))#, constrained_layout=True)
i = 0 # i = 0 for x = 0.25; i = 3 for x = -0.25
j = 6 # j = 6 for x = 0.25; j = 9 for x = -0.25
#%%
solution = np.loadtxt(open("sequential_legs=01.csv", "rb"), delimiter=",", skiprows=0)
axs[0, 0].plot(t, solution[:,i],'r-')
axs[0, 0].plot(t, solution[:,i+1],'g-')
axs[0, 0].plot(t, solution[:,i+2],'b-')
axs[0, 0].plot(t, solution[:,j],'r--')
axs[0, 0].plot(t, solution[:,j+1],'g--')
axs[0, 0].plot(t, solution[:,j+2],'b--')
axs[0, 0].set_title('DNN-S (p = 1)', fontsize=14)
axs[0, 0].set_xlim([0, 10])
(repeated for each grid)
line_labels = ["$y_1$ (True)","$y_2$ (True)", "$y_3$ (True)", "$y_1$ (ML-Pred)","$y_2$ (ML-Pred)", "$y_3$ (ML-Pred)"]
plt.figlegend( line_labels, loc = 'lower center', borderaxespad=0.1, ncol=6, labelspacing=0.,  prop={'size': 13} ) #bbox_to_anchor=(0.5, 0.0), borderaxespad=0.1, 

for ax in axs.flat:
    ax.set(xlabel='Time', ylabel='Response')

for ax in axs.flat:
    ax.label_outer()

fig.savefig('LSE_X=025.pdf', bbox_inches = 'tight')

enter image description here

1 Ответ

1 голос
/ 02 апреля 2019

constrained_layout не учитывает условные обозначения . Самый простой вариант, который я сейчас вижу здесь, - это использовать tight_layout для того, чтобы подсюжеты хорошо распределялись на рисунке, а после , добавить пространство для легенды вручную.

import matplotlib.pyplot as plt

fig, axs = plt.subplots(6, 3, figsize=(12,8), sharex=True, sharey=True,
                        constrained_layout=False)

labels = [f"Label {i}" for i in range(1,5)]

for ax in axs.flat:
    for i, lb in enumerate(labels):
        ax.plot([1,2], [0,i+1], label=lb)
    ax.set_xlabel("x label")
    ax.label_outer()

fig.tight_layout() 
fig.subplots_adjust(bottom=0.1)   ##  Need to play with this number.

fig.legend(labels=labels, loc="lower center", ncol=4)

plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...