[英]Legend with vertical line in matplotlib
出于特定原因,我需要在matplotlib图例中显示一条垂直线。 我试图让matplotlib明白我想要一条带有lines.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)
我需要显示垂直线,而不是图例。 有人可以帮忙吗?
在创建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()
如果目标是在图例中将每一行标记为垂直而不是水平,则可以通过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()
如果目标是在图例中获得绘制线的微缩版本,您原则上可以使用此答案将绘制数据的微缩版本用作图例句柄 。 考虑到可能的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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.