2013-10-10 3 views
2

Я пытаюсь получить метки с выровненными слева и значениями, выровненными по правому краю в легенде. В приведенном ниже коде я пробовал с помощью метода format, но значения не были правильно выровнены.выравнивание легенды в matplotlib

Любые подсказки/предложения приветствуются.

import matplotlib.pyplot as pl 

# make a square figure and axes 
pl.figure(1, figsize=(6,6)) 

labels = 'FrogsWithTail', 'FrogsWithoutTail', 'DogsWithTail', 'DogsWithoutTail' 
fracs = [12113,8937,45190, 10] 

explode=(0, 0.05, 0, 0) 
pl.pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True) 
pl.title('Raining Hogs and Dogs', bbox={'facecolor':'0.8', 'pad':5}) 

legends = ['{:<10}-{:>8,d}'.format(labels[idx], fracs[idx]) for idx in range(len(labels))] 

pl.legend(legends, loc=1) 

pl.show() 

ответ

3

Есть две проблемы с вашей реализацией. Во-первых, метки вашего кусочка среза намного длиннее, чем количество символов, которые вы им назначаете, с .format() (самый длинный - 16 символов, и вам разрешено пространство до 10 символов). Чтобы это исправить, изменить legend линию:

legends = ['{:<16}-{:>8,d}'.format(labels[idx], fracs[idx]) for idx in range(len(labels))] 
       ^-- change this character 

Однако, это только улучшает вещи немного. Это потому, что matplotlib использует шрифт переменной ширины по умолчанию, то есть символы, такие как m занимают больше места, чем символы, такие как i. Это фиксируется с использованием шрифта с фиксированной шириной. В Matplotlib, это достигается за счет:

pl.legend(legends, loc=1, prop={'family': 'monospace'}) 

В результате выстраивается красиво, но моноширинный шрифт имеет обратную сторону, чтобы быть немного некрасиво некоторые: enter image description here

+0

спасибо, что волшебство. У меня была большая ширина, указанная для ярлыка, но в итоге была добавлена ​​старая версия кода. настройка свойства «monospace» сделала работу. спасибо, еще раз @drs. – neon

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