Столбцы переменной длины в легенде matplotlib [дубликат]

Решение

set_fact:
  fact2: "{{ fact1 | map('regex_replace', '(.*)', 'https://\\1:8000') | join(',') }}"

Объяснение

  1. map фильтр применяет фильтр (regex_replace) к отдельным элементам списка ;
  2. regex_replace фильтр (со следующим регулярным выражением) добавляет к строке prefix и suffix;
    current_list | map('regex_replace', '(.*)', 'prefix\\1suffix')
    
  3. join filter преобразует список в строку с разделителями-запятыми в выходном файле.

Альтернативный

Еще одно возможное решение (основанное на том, что вы уже знаете) - использовать Jinja2 непосредственно для целевой строки:

set_fact:
  fact2: "{{ 'https://' + fact1|join(':8000,https://') + ':8000' }}"

4
задан user1562862 6 February 2013 в 22:34
поделиться

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()
4
ответ дан cosmosis 31 August 2018 в 17:15
поделиться

Дифференциальная реализация ответа @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)

Выполняя это, я получаю this [/g2] без необходимости добавления каких-либо других объектов.

6
ответ дан Francesco Montesano 31 August 2018 в 17:15
поделиться

Третий подход, основанный на ответе Франнеско. Нарисуйте строку-заполнитель с альфа = 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

0
ответ дан Sebastian 31 August 2018 в 17:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: