Отображение легенды только для одного субплота с использованием matplotlib

У меня проблема с отображением легенды в правильном формате с помощью matplotlib.

РЕДАКТИРОВАТЬ: у меня есть 4 субплота на рисунке в формате 2 на 2, и я хочу легенду только на первом субплоте, на котором нанесены две линии. Легенда, которую я получил, используя код, прикрепленный ниже, содержала бесконечные записи и распространялась вертикально по всему рисунку. Когда я использую тот же код, используя linspace для генерации поддельных данных, легенда работает абсолютно нормально.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick
import os

#------------------set default directory, import data and create column output vectors---------------------------#

path="C:/Users/Pacman/Data files"
os.chdir(path)
data =np.genfromtxt('vrp.txt')

x=np.array([data[:,][:,0]])

y1=np.array([data[:,][:,6]])
y2=np.array([data[:,][:,7]])
y3=np.array([data[:,][:,9]])
y4=np.array([data[:,][:,11]])
y5=np.array([data[:,][:,10]])

nrows=2
ncols=2
tick_l=6   #length of ticks
fs_axis=16 #font size of axis labels


plt.rcParams['axes.linewidth'] = 2         #Sets global line width of all the axis
plt.rcParams['xtick.labelsize']=14         #Sets global font size for x-axis labels
plt.rcParams['ytick.labelsize']=14         #Sets global font size for y-axis labels



plt.subplot(nrows, ncols, 1)

ax=plt.subplot(nrows, ncols, 1)
l1=plt.plot(x, y2, 'yo',label='Flow rate-fan')
l2=plt.plot(x,y3,'ro',label='Flow rate-discharge')
plt.title('(a)')
plt.ylabel('Flow rate ($m^3 s^{-1}$)',fontsize=fs_axis)
plt.xlabel('Rupture Position (ft)',fontsize=fs_axis)

# This part is not working
plt.legend(loc='upper right', fontsize='x-large')

#Same code for rest of the subplots

Я попытался реализовать исправление, предложенное по следующей ссылке, однако не смог заставить его работать:как сделать одну легенду для многих сюжетов с помощью matplotlib?

Любая помощь в этом отношении будет высоко оценена.

Ответы на вопрос(2)

вам нужно указать plt.legend, что обозначать легендами ... в этот момент он загружается пустым. То, что вы получаете, должно быть из другого источника. У меня быстро следующее, и, конечно, когда я запускаю fig.legend, как вы, я ничего не получаю.

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_axes([0.1, 0.1, 0.4, 0.7])
ax2 = fig.add_axes([0.55, 0.1, 0.4, 0.7])

x = np.arange(0.0, 2.0, 0.02)
y1 = np.sin(2*np.pi*x)
y2 = np.exp(-x)
l1, l2 = ax1.plot(x, y1, 'rs-', x, y2, 'go')

y3 = np.sin(4*np.pi*x)
y4 = np.exp(-2*x)
l3, l4 = ax2.plot(x, y3, 'yd-', x, y4, 'k^')

fig.legend(loc='upper right', fontsize='x-large')

#fig.legend((l1, l2), ('Line 1', 'Line 2'), 'upper left')
#fig.legend((l3, l4), ('Line 3', 'Line 4'), 'upper right')
plt.show()

Я бы предложил сделать один за другим, а затем подать заявку на всех.

 SAkht31215 июн. 2016 г., 21:19
Спасибо за ваш комментарий. Я думаю, что я не сформулировал свою проблему должным образом. Легенда, которую я получаю, используя мой код выше, содержит каждую точку данных в качестве заголовка. Следовательно, легенда отображается для каждой точки на графике и, таким образом, распространяется на весь экран и за его пределы по вертикали. Я попробовал тот же код, но сгенерировал поддельные данные, используя linspace, и это сработало.
Решение Вопроса

Полезно работать с осями напрямую (ax в вашем случае) при работе с участками. Так что, если вы создали два сюжета на рисунке и хотите иметь только легенду на своем втором сюжете:

t = np.linspace(0, 10, 100)

plt.figure()

ax1 = plt.subplot(2, 1, 1)
ax1.plot(t, t * t)

ax2 = plt.subplot(2, 1, 2)
ax2.plot(t, t * t * t)
ax2.legend('Cubic Function')

Обратите внимание, что при создании легенды я делаю это наax2 в отличие отplt, Если вы хотите создать вторую легенду для первого участка, вы можете сделать это так же, но наax1.

 SAkht31216 июн. 2016 г., 23:45
Спасибо, это сработало путем удаления внешних квадратных скобок из всех векторов, таких как y1 = np.array ([data [:,] [:, 6]])
 SAkht31215 июн. 2016 г., 21:17
Спасибо за ваш комментарий. Я думаю, что я не сформулировал свою проблему должным образом. Легенда, которую я получаю, используя мой код выше, содержит каждую точку данных в качестве заголовка. Следовательно, легенда отображается для каждой точки на графике и, таким образом, распространяется на весь экран и за его пределы по вертикали. Я попробовал тот же код, но сгенерировал поддельные данные, используя linspace, и это сработало.
 Sajjan Singh15 июн. 2016 г., 23:20
Я бы сначала проверил, какие формы у ваших массивовx, y2, а такжеy3 в случае, если они не простые одномерные массивы

Ваш ответ на вопрос