删除 matplotlib 图上的图例
Posted
技术标签:
【中文标题】删除 matplotlib 图上的图例【英文标题】:Remove the legend on a matplotlib figure 【发布时间】:2011-08-09 18:19:29 【问题描述】:要在 matplotlib 图中添加图例,只需运行 legend()
。
如何删除情节中的图例?
(我最接近的方法是运行legend([])
以从数据中清空图例。但这会在右上角留下一个难看的白色矩形。)
【问题讨论】:
【参考方案1】:从matplotlib v1.4.0rc4
开始,remove
方法已添加到图例对象中。
用法:
ax.get_legend().remove()
或
legend = ax.legend(...)
...
legend.remove()
请参阅 here 以了解引入此功能的提交。
【讨论】:
由于某种原因,ax.get_legend().remove()
解决方案在我的情况下不起作用,而第二个解决方案 (legend = ax.legend() ... legend.remove()
) 起作用。可能是因为 ax
在我的情况下是 AxesSubplot
?
@naitsirhc,感谢您的分享。【参考方案2】:
如果要绘制 Pandas 数据框并删除图例,请将 legend=None 作为参数添加到绘图命令。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df2 = pd.DataFrame(np.random.randn(10, 5))
df2.plot(legend=None)
plt.show()
【讨论】:
【参考方案3】:您可以使用图例的set_visible
方法:
ax.legend().set_visible(False)
draw()
这是基于对我前段时间here的类似问题的回答提供给我的
(感谢 Jouni 的回答 - 很抱歉我无法将问题标记为已回答......也许有权限的人可以为我这样做?)
【讨论】:
这只是隐藏了图例,实际上并没有删除对象,对吧?【参考方案4】:您必须添加以下代码行:
ax = gca()
ax.legend_ = None
draw()
gca() 返回当前坐标区句柄,并具有该属性 legend_
【讨论】:
谢谢,这似乎有效。 (但多么可怕的界面……)我建议用show()
替换draw()
。或者使用draw
有什么特别的优势吗?
如果图形更新是程序的最后一个命令,show()
就可以了。 draw()
很好,因为它是通用的图形更新命令。例如,您可能希望在更新图表后提示用户在终端中进行一些输入,而阻塞 show()
无法做到这一点。
对。感谢您的回答。现在我同意draw
更合适(但我一直使用show
来更新我的图表...)。【参考方案5】:
如果您将pyplot
称为plt
frameon=False
是去掉图例周围的边框
'' 传递的信息是图例中不应包含任何变量
import matplotlib.pyplot as plt
plt.legend('',frameon=False)
【讨论】:
【参考方案6】:如果你不使用 fig 和 ax 绘图对象,你可以这样做:
import matplotlib.pyplot as plt
# do plot specifics
plt.legend('')
plt.show()
【讨论】:
将图例保留为空框【参考方案7】:根据@naitsirhc 提供的信息,我想查找官方API 文档。这是我的发现和一些示例代码。
-
我通过
seaborn.scatterplot()
创建了一个matplotlib.Axes
对象。
ax.get_legend()
将返回一个 matplotlib.legned.Legend
实例。
最后,您调用 .remove()
函数从绘图中删除图例。
ax = sns.scatterplot(......)
_lg = ax.get_legend()
_lg.remove()
如果您查看matplotlib.legned.Legend
API 文档,您将看不到.remove()
函数。
原因是matplotlib.legned.Legend
继承了matplotlib.artist.Artist
。因此,当您调用ax.get_legend().remove()
时,基本上会调用matplotlib.artist.Artist.remove()
。
最后,您甚至可以将代码简化为两行。
ax = sns.scatterplot(......)
ax.get_legend().remove()
【讨论】:
这就像一个魅力。谢谢!【参考方案8】:我通过将它添加到图形而不是轴(matplotlib 2.2.2)来制作图例。要删除它,我将图形的legends
属性设置为一个空列表:
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = ax1.twinx()
ax1.plot(range(10), range(10, 20), label='line 1')
ax2.plot(range(10), range(30, 20, -1), label='line 2')
fig.legend()
fig.legends = []
plt.show()
【讨论】:
【参考方案9】:如果您使用的是 seaborn,您可以使用参数legend
。即使您在同一个图中多次绘制。一些df的例子
import seaborn as sns
# Will display legend
ax1 = sns.lineplot(x='cars', y='miles', hue='brand', data=df)
# No legend displayed
ax2 = sns.lineplot(x='cars', y='miles', hue='brand', data=df, legend=None)
【讨论】:
这不适用于 seaborn.boxplot()
方法
因为 boxplot 没有那个参数。但其余的他们做以上是关于删除 matplotlib 图上的图例的主要内容,如果未能解决你的问题,请参考以下文章