2016-03-25 10 views
1

В моей легенде ширина ручек отличается, для большей ясности взгляда на этом примере:Является ли способ установить длину handle для определенного дескриптора, а не для всех?

----- Sin(x) 
... Cos(x) 
____ Tan(x) 

Если я устанавливаю handlelength он применяется для всех из них, и нет никакого способа, чтобы подогнать их к одной ширине, так могу ли я установить параметр handlelength для конкретного дескриптора для настройки этого примера?

ответ

1

Вот один из способов контроля длины дескриптора (хотя и не использования этого параметра) и установки его максимального значения/длины в легенде (которая устанавливает размер легенды). Этот подход непосредственно изменяет объект линии в легенде.

LEGEND = ax.legend() 
LLINES = LEGEND.get_lines() 

MAX = max([max(X) for X in [L.get_xdata() for L in LLINES]]) 

for L in LLINES: 
    plt.setp(L,xdata=np.array([L.get_xdata()[0],MAX])) 

Во-первых, вы извлечь строки из легенды, используя get_lines(). Из этих объектов вы можете извлечь значения x, используя get_xdata(). Это объединяется здесь в одну строку, которая определяет максимальное значение x из всех записей легенды.
Как только этот максимум, MAX, был получен, вы можете пропустить все объекты линии в легенде и установить максимальное значение x извлеченному MAX. Это сделает все строки одинаково длинными.


Вот пример. Сначала он управляет одной линией легенды, чтобы быть длиннее (легенда не изменяет размер, так что это можно сделать только до сих пор, и это просто показать здесь пример). Затем он извлекает новый максимум и задает все длины соответственно.

from math import pi as pi 
import numpy as np 
import matplotlib.pyplot as plt 

x=np.linspace(0.0,2.0*pi,101) 

fig,ax = plt.subplots() 

LABEL = ['Sin(x)', 'Cos(x)', 'Tan(x)'] 

LINE = [[],[],[]] 

LINE[0] = ax.plot(x,np.sin(x),label=LABEL[0]) 
LINE[1] = ax.plot(x,np.cos(x),label=LABEL[1]) 
LINE[2] = ax.plot(x,np.tan(x),label=LABEL[2]) 

ax.set_ylim([-1.0,1.0]) 

LEGEND = ax.legend() 

plt.show() 

Это сюжет с оригинальной легендой:

original legend

Теперь можно сбросить первую длину строки до более значений, например:

LLINES = LEGEND.get_lines() 

plt.setp(LLINES[0],xdata=np.array([LLINES[0].get_xdata()[0],\ 
            LLINES[0].get_xdata()[1]*1.25])) 

plt.show() 

В результате в эта легенда:

longer single entry

И, наконец, вышеописанный способ, чтобы получить самую длинную линию и применить его ко всей линии легенды:

MAX = max([max(X) for X in [L.get_xdata() for L in LLINES]]) 

for L in LLINES: 
    plt.setp(L,xdata=np.array([L.get_xdata()[0],MAX])) 

plt.show() 

проявляющейся во всех линиях, имеющие один и ту же - теперь увеличения - длина:

all long