更改主图图例标签文本

Posted

技术标签:

【中文标题】更改主图图例标签文本【英文标题】:Change main plot legend label text 【发布时间】:2014-05-27 01:58:23 【问题描述】:

到目前为止,我已经能够很好地标记子图,但我遇到了主要的问题。

这是我的代码的相关部分:

data_BS_P = data[channels[0]]
data_BS_R = data[channels[1]]
data_BS_Y = data[channels[2]]
plot_BS_P = data_BS_P.plot() #data_BS_P is a pandas dataframe
axBS = plot_BS_P.gca()
axBS.plot(data_BS_R, label='Roll')
axBS.plot(data_BS_Y, label='Yaw')
axBS.set_ylabel('Amplitude (urad)')
axBS.legend(loc='upper center', bbox_to_anchor=(0.5, 1.05), ncol=3,
            fancybox=True, shadow=True)
ml1 = MultipleLocator(10)
ml2 = MultipleLocator(3600)
axBS.yaxis.set_minor_locator(ml1)
axBS.xaxis.set_minor_locator(ml2)
plot_BS_P.save('L1-SUS-BS_M1_DAMP_PRY_INMON.jpg')

这就是我目前所拥有的: 注意蓝线的冗长标签。我希望将其标记为“音高”而不是文件名。我可以在哪一行执行此操作?

【问题讨论】:

您没有发布足够的代码来解决这个问题。在绘制蓝线的位置发布代码。我认为问题出在这一行plot_BS_P = data_BS_P.plot() @ebarr,plot_BS_P = data_BS_P.plot() 做到了。 data_BS_P 可能是 pandas DataFrame,它有自己的名字印迹。我说得对吗,O.P.? 绘制蓝线的是 data_BS_P.plot()。上面的行是 data = TimeSeriesDict.fetch(channels, start, end, verbose=True) 其余的是我必须下载的大量频道列表... 【参考方案1】:

您需要访问legend() 对象并使用set_text() 更改文本值,一个简单的示例:

plt.plot(range(10), label='Some very long label')
plt.plot(range(1,11), label='Short label')
L=plt.legend()
L.get_texts()[0].set_text('make it short')
plt.savefig('temp.png')

在您的情况下,您正在更改图例中的第一项,我很确定 L.get_texts()[0] 中的 0 索引也适用于您的问题。

【讨论】:

在交互模式下,添加plt.gcf().canvas.draw()以使用新标签重绘图形。 (在提供的示例中,plt.savefig 在保存之前更新图。) 短一点:L.texts[0]..set_text('shorter')【参考方案2】:

另一种方式:

ax.legend(labels=mylabels)

【讨论】:

对于我的用例来说,这是迄今为止最简单的方法。谢谢。 等效地,如果 ax 没有明确定义,那么当然 plt.legend(labels=my_labels) 其中 my_labels 是一个列表。 当用 seaborn 制作箱线图时,这打破了传说中的补丁颜色。 我用过但是不保留颜色不知道为什么...【参考方案3】:

ksindi 的答案适用于设置标签,但正如其他人评论的那样,当与 seaborn 一起使用时,它可能会破坏图例颜色(在我的情况下是散点图:点和文本不再正确排列)。为了解决这个问题,也将句柄传递给 ax.legend。

# the legend has often numbers like '0.450000007', the following snippet turns those in '0.45'
label_list = []
for t in ax.get_legend_handles_labels():
    # the first result will be all handles, i.e. the dots in the legend
    # the second result will be all legend text
    label_list.append(t)

new_list = []
for txt in label_list[1]:
    if txt[0] == '0':
        txt = str(txt)[:4]
    new_list.append(txt)
label_list[1] = new_list

ax.legend(handles=label_list[0], labels=label_list[1])

(我会将此作为评论发布,但还没有足够的声誉)

【讨论】:

以上是关于更改主图图例标签文本的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2016堆积条形图图例:更改标签标题

使用长标签名称设置标准图例键大小 ggplot

如何更改图例中的标签?

更改 matplotlib 图例中各个标签的字体大小

更改图例标签时,Matplotlib 图例颜色会发生变化

更改 Seaborn 散点图中的图例位置和标签