Начиная с - afaik - matplotlib 3.1 вы можете использовать рисунок с легендой , то есть просто использовать легенду, как и раньше, но не как метод plt
или ваш axs
, а с fig
:
fig.legend()
в вашем примере для нижнего центра и трех столбцов, например:
fig.legend(loc=8, ncol=3)
относительно перекрытия:
legend
может толькосоздайте легенду и разместите ее где угодно, чтобы предотвратить наложение, вам понадобится plt.tight_layout()
с правильным значением rect
, например,
plt.tight_layout(rect=[0, .05, 1, 1])
и для дубликатов:
legend
собирает все помеченные графики, поэтому, конечно, это причина, по которой вы получаете дубликаты при создании графиков в цикле, как вы делали выше.
Однако вы можете предотвратить это с помощью небольшой функции:предписанное подчеркивание подавляет метку, которая будет добавлена в легенду, например, label='VWAP Paid'
не будет отображаться в легенде.
Зная это, вы можете добавить подчеркивание в зависимости от счетчика вашей петли, например:
label=('', '_')[i>0] + 'VWAP Paid'
Кстати, вы действительно должны рассмотреть возможность использования
for i, ax in enumerate(axs): # ...(axs.flatten()): if you would have several rows _and_ colmns
вместо
for i in range(number_of_charts):
Это открывает возможность записать ax
вместо axs[i]
, но все равно предоставляет i
в качестве переменной счетчика, если вам это нужно (например, длядобавление подчеркивания за исключением первого цикла ... :))
РЕДАКТИРОВАТЬ:
это будет ваш кодс моими предложениями:
fig, axs = plt.subplots(len(weeks_df_list), sharex=True, figsize=[8, 17])
fig.subplots_adjust(hspace=.5)
for i, (ax, df) in enumerate(zip(axs, weeks_df_list)):
print("i:", i)
#percent daily
ax.plot(df['pct_daily_vol'].multiply(100).round(2), label=('', '_')[i>0] + '% Daily Volumes', color='blue')
ax.yaxis.set_major_formatter(mtick.PercentFormatter())
#percent daily max
ax.plot(df['pct_daily_limit'].multiply(100).round(2), label=('', '_')[i>0] + '% Daily Limit', color='orange')
ax.yaxis.set_major_formatter(mtick.PercentFormatter())
#secondary axis
axs_2 = ax.twinx()
axs_2.plot(df['vwap'], label=('', '_')[i>0] + 'VWAP Paid', color='green')
#comon variables
ax.set_yticks(np.arange(0, 100, 20))
ax.set_ylim(0, 100)
ax.set_title('Week:' + str(i + 1))
ax.grid(True)
fig.legend(loc=8, ncol=3)
plt.tight_layout(rect=[0, .05, 1, 1])