Легенда с вертикальной линией в матплотлибе - PullRequest
0 голосов
/ 02 ноября 2018

Мне нужно показать вертикальную линию в легенде matplotlib по определенной причине. Я пытаюсь заставить matplotlib понять, что я хочу вертикальную линию с линиями. Line2D (x, y), но это явно не работает.

import matplotlib.pyplot as plt
from matplotlib import lines
fig, ax = plt.subplots()
ax.plot([0,0],[0,3])
lgd = []
lgd.append(lines.Line2D([0,0],[0,1], color = 'blue', label = 'Vertical line'))
plt.legend(handles = lgd)

enter image description here

Мне нужна вертикальная линия, а не легенда. Кто-нибудь может помочь?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Отметить все линии вертикально

Если цель состоит в том, чтобы обозначить каждую строку в легенде вертикально, а не горизонтально, вы можете обновить дескриптор легенды с помощью handler_map.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.legend_handler import HandlerLine2D

plt.plot([1,3,2], label='something')
plt.plot([.5,.5], [1,3], label='something else')

def update_prop(handle, orig):
    handle.update_from(orig)
    x,y = handle.get_data()
    handle.set_data([np.mean(x)]*2, [0, 2*y[0]])

plt.legend(handler_map={plt.Line2D:HandlerLine2D(update_func=update_prop)})

plt.show()

enter image description here

Точная копия в миниатюрном виде

Если цель состоит в том, чтобы получить миниатюрную версию нанесенной линии в легенде, вы в принципе можете использовать этот ответ для Используя миниатюрную версию нанесенных данных в качестве дескриптора легенды . Существует небольшая модификация, необходимая для учета ограничивающего прямоугольника шириной 0, который я теперь также отредактировал в исходном ответе. Здесь это будет выглядеть так:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.legend_handler import HandlerLine2D
import matplotlib.path as mpath
from matplotlib.transforms import BboxTransformFrom, BboxTransformTo, Bbox


class HandlerMiniatureLine(HandlerLine2D):
    def create_artists(self, legend, orig_handle,
                       xdescent, ydescent, width, height, fontsize,
                       trans):

        legline, _ = HandlerLine2D.create_artists(self,legend, orig_handle,
                                xdescent, ydescent, width, height, fontsize, trans)

        legline.set_data(*orig_handle.get_data())

        ext = mpath.get_paths_extents([orig_handle.get_path()])
        if ext.width == 0:
            ext.x0 -= 0.1
            ext.x1 += 0.1
        bbox0 = BboxTransformFrom(ext)
        bbox1 = BboxTransformTo(Bbox.from_bounds(xdescent, ydescent, width, height))

        legline.set_transform(bbox0 + bbox1 + trans)
        return legline,


plt.plot([1,3,2], label='something')
plt.plot([.5,.5], [1,3], label='something else')

plt.legend(handler_map={plt.Line2D:HandlerMiniatureLine()})

plt.show()

enter image description here

0 голосов
/ 02 ноября 2018

Вы можете использовать маркер вертикальной линии при создании объекта line2D. Список допустимых маркеров можно найти здесь .

import matplotlib.pyplot as plt
from matplotlib import lines

fig, ax = plt.subplots()
ax.plot([0,0],[0,3])

vertical_line = lines.Line2D([], [], color='#1f77b4', marker='|', linestyle='None',
                          markersize=10, markeredgewidth=1.5, label='Vertical line')

plt.legend(handles = [vertical_line])

plt.show()

enter image description here

...