如何在图例描述中引用其他容器?
Posted
技术标签:
【中文标题】如何在图例描述中引用其他容器?【英文标题】:How to reference other containers in legend description? 【发布时间】:2021-10-26 06:41:41 【问题描述】:我想在一个元素的标签中引用另一个容器。我在下面附上了一些代码,而不是说“”,我更希望有一个代表“数据”的蓝色框。
import numpy as np
from matplotlib import pyplot as plt
data = np.arange(5)
fig, ax = plt.subplots()
bar_1 = ax.bar(np.arange(len(data)), data, align="center", label="data")
ax.hlines(data.mean(), 0, len(data), ls="--", label=f"mean of bar_1")
plt.legend()
plt.show()
编辑: 我希望结果看起来像这样:
【问题讨论】:
你的意思是你想做这样的事情?from matplotlib.legend_handler import HandlerTuple;handler, label = ax.get_legend_handles_labels();plt.legend([(hl, bar_1), bar_1], [None,label[1]], handler_map=tuple: HandlerTuple(ndivide=None))
@r-beginners 我不明白你的意思,你的代码给了我一个错误AttributeError: 'NoneType' object has no attribute 'create_artists'
。 @JohanC 是的,但我更喜欢蓝色框而不是名称。我在上面添加了一个示例。
@r-beginners 谢谢,我错过了hl = ax.hlines
。如第二张图片所示,我希望处理程序位于标签中,而不是更改平均值的处理程序。也许一个人不能混合标签和处理程序?
据我所知,我从未见过处理程序和标签的混合。嗯,这只是我有限的经验,所以希望会有一些很好的答案。
图例的位置会变吗?我可以想出一个(有点愚蠢的)解决方法来让它在视觉上像你想要的那样。但正如我所说,这是一个非常愚蠢的解决方案,所以不要为它扔石头;)
【参考方案1】:
这是一种愚蠢的方法:
import matplotlib.patches as mpatches
import matplotlib.lines as mlines
import numpy as np
from matplotlib import pyplot as plt
data = np.arange(5)
plt.close()
fig, ax = plt.subplots()
bar_1 = ax.bar(np.arange(len(data)), data, align="center", label="data")
ax.hlines(data.mean(), 0, len(data), ls="--", label=f"mean of bar_1")
ax1 = fig.add_subplot(221)
ax1.set_xlim(0, 1)
ax1.set_ylim(0, 1)
ax1.axis('off')
blue_patch = mpatches.Patch(label='data')
blue_dline = mlines.Line2D([], [], marker='', linestyle='--', label='mean of ')
nothing = mlines.Line2D([], [], marker='', linestyle='', label='')
ax2 = ax1.twinx()
ax2.axis('off')
ax1.legend(handles=[blue_dline, blue_patch], loc=(0.02, 0.7))
ax2.legend(handles=[blue_patch, nothing], framealpha=0, loc=(0.465, 0.7), handletextpad=0.2)
plt.show()
输出:
只要它有效,谁在乎它是否愚蠢;)
【讨论】:
丹克卡琳娜,这对我有用。用图例制作子图是个好主意。这不必很好或性能代码,我只需要一些漂亮的情节;) Bitte :) 我认为也可以通过使用注释使其成为性能代码。但由于我不习惯,所以需要更多时间。以上是关于如何在图例描述中引用其他容器?的主要内容,如果未能解决你的问题,请参考以下文章