2013-11-18 4 views
14

У меня есть график, левый верхний угол которого довольно пуст. Поэтому я решил разместить свою легендарную коробку.Как отрегулировать размер окна легенды matplotlib?

Однако я нахожу элементы в легенде очень малы и самалегенда коробка тоже совсем маленький.

Под "небольшой", я имею в виду что-то вроде этого

enter image description here

Как я могу сделать элементы (не тексты!) в поле легенды больше?

Как я могу сделать коробку самой большой?

ответ

51

Для управления надписью внутри легенды (эффективно создавая легендарную коробку больше) используйте borderpad kwarg.

Например, вот по умолчанию:

import matplotlib.pyplot as plt 
import numpy as np 

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

fig, ax = plt.subplots() 
for i in range(1, 6): 
    ax.plot(x, i*x + x, label='$y={i}x + {i}$'.format(i=i)) 
ax.legend(loc='upper left') 
plt.show() 

enter image description here


Если мы изменяем внутри прокладки с borderpad=2, мы сделаем общий ящик легенда больше (единицы являются кратными размер шрифта, аналогичный em):

import matplotlib.pyplot as plt 
import numpy as np 

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

fig, ax = plt.subplots() 
for i in range(1, 6): 
    ax.plot(x, i*x + x, label='$y={i}x + {i}$'.format(i=i)) 
ax.legend(loc='upper left', borderpad=2) 
plt.show() 

enter image description here


В качестве альтернативы, вы можете изменить расстояние между элементами. Используйте labelspacing для управления этим:

import matplotlib.pyplot as plt 
import numpy as np 

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

fig, ax = plt.subplots() 
for i in range(1, 6): 
    ax.plot(x, i*x + x, label='$y={i}x + {i}$'.format(i=i)) 
ax.legend(loc='upper left', labelspacing=2) 
plt.show() 

enter image description here


В большинстве случаев, однако, это имеет наибольший смысл регулировать как labelspacing и borderpad в то же время:

import matplotlib.pyplot as plt 
import numpy as np 

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

fig, ax = plt.subplots() 
for i in range(1, 6): 
    ax.plot(x, i*x + x, label='$y={i}x + {i}$'.format(i=i)) 
ax.legend(loc='upper left', borderpad=1.5, labelspacing=1.5) 
plt.show() 

enter image description here


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

import matplotlib.pyplot as plt 
import numpy as np 

x = np.linspace(0, 10, 5) 

fig, ax = plt.subplots() 
for i in range(1, 6): 
    ax.plot(x, i*x + x, marker='o', markersize=20, 
      label='$y={i}x + {i}$'.format(i=i)) 
ax.legend(loc='upper left') 
plt.show() 

enter image description here

Если мы изменим handlelength, мы получим более длинные строки в легенде, которая выглядит немного более реалистичным. (Я также настраиваю borderpad и labelspacing здесь, чтобы дать больше места.)

import matplotlib.pyplot as plt 
import numpy as np 

x = np.linspace(0, 10, 5) 

fig, ax = plt.subplots() 
for i in range(1, 6): 
    ax.plot(x, i*x + x, marker='o', markersize=20, 
      label='$y={i}x + {i}$'.format(i=i)) 
ax.legend(loc='upper left', handlelength=5, borderpad=1.2, labelspacing=1.2) 
plt.show() 

enter image description here


Из документов, вот некоторые из других параметров, которые вы можете изучить:

Padding and spacing between various elements use following 
keywords parameters. These values are measure in font-size 
units. E.g., a fontsize of 10 points and a handlelength=5 
implies a handlelength of 50 points. Values from rcParams 
will be used if None. 

===================================================================== 
Keyword  | Description 
===================================================================== 
borderpad   the fractional whitespace inside the legend border 
labelspacing  the vertical space between the legend entries 
handlelength  the length of the legend handles 
handletextpad  the pad between the legend handle and text 
borderaxespad  the pad between the axes and legend border 
columnspacing  the spacing between columns 
+0

Это так здорово! Он даже решает некоторые мои вопросы, которые я не задавал! Огромное спасибо. Опять же, это определенно должно быть добавлено в matplotlib docs! Шляпы от тебя, сэр! –

+3

@ perfectionm1ng - Рад помочь! Возможно, вы также захотите взглянуть на «markerscale» kwarg. Поскольку высота усов ошибок в легенде контролируется высотой текста, много раз вы хотите сжимать «точку» в легенде, чтобы сделать провалы с ошибками более очевидными. К сожалению, я не думаю, что есть простой способ сказать «сделать ошибки в легенде вдвое большей», не изменяя другие вещи (например, размер шрифта). «markerscale» - разумное решение проблемы. –

9

При вызове легенды вы можете использовать prop аргумент с размером, содержащим dict.

plt.errorbar(x, y, yerr=err, fmt='-o', color='k', label = 'DR errors') 
plt.legend(prop={'size':50}) 

E.g. change legend size

Смотрите здесь для получения дополнительной информации о legend

Смежные вопросы