Заполните правый столбец легенды matplotlib

Эй, я пытаюсь подгонять легенду на сюжет, чтобы он не скрывал график.

import numpy as np import matplotlib.pyplot as plt X = np.linspace(0,100,11) plt.plot(X,-X, label='plot 1') plt.plot(X,-2*X, label='plot 2') plt.plot(X,-3*X, label='plot 3') leg=plt.legend(ncol=2) leg.get_frame().set_visible(False) plt.show() 

Итак, в минимальном рабочем примере выше, что я хочу сделать, это переместить метку «plot 2» в легенде в правый столбец, то есть непосредственно под «plot 3».

Любая помощь будет оценена, спасибо.

Легенда заполняется колонками слева направо. Другими словами, если вы обманом поймете, что есть еще одна строка (без текста или цвета строки в легенде), вы можете заполнить пространство под «plot 3».

 import numpy as np import matplotlib.pyplot as plt from pylab import * X = np.linspace(0,100,11) plt.plot(X,-X, label='plot 1', color='red') plt.plot(X,-2*X, label='plot 2', color='green') plt.plot(X,-3*X, label='plot 3', color='blue') line1 = Line2D(range(10), range(10), marker='', color="red") line2 = Line2D(range(10), range(10), marker='',color="green") line3 = Line2D(range(10), range(10), marker='', color="blue") line4 = Line2D(range(10), range(10), marker='', color="white") plt.legend((line1,line4, line3,line2),('plot1','','plot3','plot2'),numpoints=1, loc=4,ncol=2) plt.show() 

Дифференциальная реализация ответа @cosmosis. Это, вероятно, более гибко.

 import numpy as np import matplotlib.pyplot as plt X = np.linspace(0,100,11) plt.plot(X,-X, label='plot 1', color='red') plt.plot(X,-2*X, label='plot 2', color='green') plt.plot(X,-3*X, label='plot 3', color='blue') (lines, labels) = plt.gca().get_legend_handles_labels() #it's safer to use linestyle='none' and marker='none' that setting the color to white #should be invisible whatever is the background lines.insert(1, plt.Line2D(X,X, linestyle='none', marker='none')) labels.insert(1,'') plt.legend(lines,labels,numpoints=1, loc=4,ncol=1) plt.show() 

Другой вариант – создать две легенды, как здесь, а затем вытеснить их с помощью ключевого слова bbox_to_anchor здесь

 (lines, labels) = plt.gca().get_legend_handles_labels() leg1 = plt.legend(lines[:1], labels[:1], bbox_to_anchor=(0,0,0.8,1), loc=1) leg2 = plt.legend(lines[1:], labels[1:], bbox_to_anchor=(0,0,1,1), loc=1) gca().add_artist(leg1) 

делаю это я получаю это без необходимости добавлять какие-либо другие объекты.

Третий подход, основанный на ответе Франнеско. Нарисуйте линию заполнителя с альфа = 0 (прозрачным).

 #draw your actual lines here #plt.... lines, labels = plt.gca().get_legend_handles_labels() lines.insert(1, plt.Line2D([],[], alpha=0)) labels.insert(1,'') plt.legend(lines,labels,ncol=2) plt.show() 

Это имеет те же преимущества, что и в его ответе. Однако это решение не работает в matplotlib 1.5.1 (под python3), говоря, что ValueError: Unrecognized marker style none