添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

如何自定义图标图例

图例可以为可视化赋予实际含义,为不同的图标元素附上明确说明。我们前面看到了一些简单的图例创建例子;本小节中我们来介绍一下在 Matplotlib 中自定义图例的位置和进行美化的方法。

a.简单图例

可以使用plt.legend()函数来创建最简单的图例,这个函数能自动创建任何带有标签属性的图表元素的图例:

import matplotlib.pyplot as plt
plt.style.use('classic')
%matplotlib inline
import numpy as np
x = np.linspace(0, 10, 1000)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), '-b', label='Sine')
ax.plot(x, np.cos(x), '--r', label='Cosine')
ax.axis('equal')
leg = ax.legend();

在这里插入图片描述
但除此之外还有很多能自定义图例的方法。例如,我们可以指定图例位置并且去除边框:

ax.legend(loc='upper left', frameon=False)

在这里插入图片描述
我们可以使用ncol属性设置图例中每行的列数:

ax.legend(frameon=False, loc='lower center', ncol=2)

在这里插入图片描述
还可以使用圆角方框(fancybox)或者增加阴影,设置方框的透明度(alpha 值)或修改文字的边距:

ax.legend(fancybox=True, framealpha=1, shadow=True, borderpad=1)

在这里插入图片描述
要获取更多 legend 函数的可用选项信息,请参考plt.legend的文档字符串。

b.选择设置图例的元素

正如我们前面例子所示,绘制的图例默认包括所有带标签的元素。如果这不是想要的效果,我们可以调整哪些元素和标签会出现在图例当中,这可以通过设置 plot 函数或方法返回的对象实现。plt.plot函数能够同时产生多条折线,然后将这些线条的实例列表返回。将其中的部分实例传递到plt.legend()函数就能设置哪些线条会出现在图例中,再通过一个标签的列表指定图例的名称:

y = np.sin(x[:, np.newaxis] + np.pi * np.arange(0, 2, 0.5))
lines = plt.plot(x, y)
# lines是一个线条实例的列表
plt.legend(lines[:2], ['first', 'second']);

在这里插入图片描述
作者更加倾向于使用第一种方式,因为更加清晰。通过将标签应用在图表元素上,然后绘制到图例中:

plt.plot(x, y[:, 0], label='first')
plt.plot(x, y[:, 1], label='second')
plt.plot(x, y[:, 2:])
plt.legend(framealpha=1, frameon=True);

在这里插入图片描述
请注意默认情况下,legend 会忽略所有不带标签的元素。

c.散点大小的图例

某些情况下默认的图例不足以满足特定的可视化需求。例如,你在使用散点的大小来标记数据的某个特征,然后希望创建一个相应的图例。下面的例子是加州城市人口的散点图,我们使用散点的大小表现该城市的面积,散点的颜色来表现城市的人口数量(自然对数值)。我们希望使用一个图例来指明散点尺寸的比例,同时用一个颜色条来说明人口数量,我们可以通过自定义绘制一些标签数据来实现尺寸图例:

译者注:新版 Matplotlib 已经取消 aspect 参数,此处改为使用新的’scaled’参数调用 axis 函数。

import pandas as pd
cities = pd.read_csv(r'D:\python\Github学习材料\Python数据科学手册\data\california_cities.csv')
# 提取我们感兴趣的数据
lat, lon = cities['latd'], cities['longd']
population, area = cities['population_total'], cities['area_total_km2']
# 绘制散点图,使用尺寸代表面积,颜色代表人口,不带标签
plt.scatter(lon, lat, label=None,
            c=np.log10(population), cmap='viridis',
            s=area, linewidth=0, alpha=0.5)
plt.axis('scaled')
plt.xlabel('longitude')
plt.ylabel('latitude')
plt.colorbar(label='log$_{10}$(population)')
plt.clim(3, 7)
# 下面我们创建图例:
# 使用空列表绘制图例中的散点,使用不同面积和标签,带透明度
for area in [100, 300, 500]:
    plt.scatter([], [], c='k', alpha=0.3, s=area,
                label=str(area) + ' km$^2$')
plt.legend(scatterpoints=1, frameon=False, labelspacing=1, title='City Area')
plt.title('California Cities: Area and Population');

在这里插入图片描述
之前的图例都关联着图表上的一些对象,因此如果我们需要展示图例的话我们首先需要绘制图表元素。在上例中,我们需要的图例对象(灰色圆圈)不在图表上,因此我们采用绘制空列表的方式将它们仿造在图表上(实际上图上没有点),但是还是需要注意,只有那些带标签的元素才会出现在图例中。

通过绘制空列表,我们创建了三个带标签的对象,然后就可以出现在图例当中,这个图例就能表示出有关城市面积的相关信息。这个策略在很多复杂可视化图表构建过程中都被用到。

最后我们注意到这个图表实际上是一个地理位置图表,如果我们能在上面绘制州界线或其他地图相关的元素的话,会更加清晰。Matplotlib 提供了一个 Basemap 额外工具集来实现这个目标。

d.多重图例

有时候我们可能需要在同一个图表维度中设计多个图例。不幸的是,Matplotlib 并没有提供很简单的方式实现:通过标准的legend接口,只能在整张图表上创建一个图例。如果你试图使用plt.legend()或ax.legend()创建第二个图例,那么第二条语句创建的图例会覆盖第一条语句创建的。我们只能通过从底层开始来创建一个新的图例 artist 这种方法来解决这个问题,然后使用ax.add_artist()的底层方法手动将第二个作者加到图表上:

fig, ax = plt.subplots()
lines = []
styles = ['-', '--', '-.', ':']
x = np.linspace(0, 10, 1000)
for i in range(4):
    lines += ax.plot(x, np.sin(x - i * np.pi / 2),
                     styles[i], color='black')
ax.axis('equal')
# 指定第一个图例的线条和标签
ax.legend(lines[:2], ['line A', 'line B'],
          loc='upper right', frameon=False)
# 手动创建第二个图例,并将作者添加到图表中
from matplotlib.legend import Legend
leg = Legend(ax, lines[2:], ['line C', 'line D'],
             loc='lower right', frameon=False)
ax.add_artist(leg);

在这里插入图片描述
上例展示了用来组成任何 Matplotlib 图表的底层 artist 对象的简单说明。如果你去查看ax.legend()的源代码(你可以通过 IPython 的ax.legend??帮助工具做到),你可以看到这个方法包含了用来构建合适Legend的 artist 对象的逻辑,构建的对象被保存在legend_属性当中,当绘制时被添加到图表上进行展示。

背景:不是所有的句柄(handles)都可以自动转化成legend,所以有必要自己创建一个artist来实现此功能,可参考一下下面官方的文档: Creating artists specifically for adding to the legend (aka. Proxy artists) 文档只创建了一个图例,比如我有下图,我就需要四个图例: 我想根据色条创建四个图例,并添加相应地...
plt.plot(x, y_shanghai, label="上海") # 使用多次plot可以画多个折线 plt.plot(x, y_beijing, color='r', linestyle='--', label="北京") # 显示图例 plt.legend(loc="best") plt.legend(labels=["sin function","cos function"],loc="lower right",fontsize=6) #labels为图例的文字标注,loc为图例放置的位置 loc参数的含义 best :自动选择最佳位置。 upper right :将图例放在右上角。 upper left :将图例放在左上角。 lower left :将图例放在左下角。 lower right :将图例放在右下角。 right :将图例放在右边。 center lef
近期请国内外头部出版社可尽快私信博主!——心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,谦虚,自律,反思,成长,还算是比较正能量的博主,公益免费传播……内心特别想在AI界做出一些可以推进历史进程影响力的东西(兴趣使然,有点小情怀,也有点使命感呀)… 12-21
`plt.legend()`是Matplotlib库中用于添加图例的函数。在Matplotlib中,图例是用于标注图表中不同元素的标签,以帮助读者更好地理解图表。例如,在一个包含多个数据系列的图表中,图例可以用于标注每个数据系列的名称和颜色。 `plt.legend()`函数通常在绘制完所有需要标注的元素后调用。例如,在一个包含多个散点图的图表中,可以通过以下代码添加图例: import matplotlib.pyplot as plt plt.scatter(x_data1, y_data1, c='r', label='Data Series 1') plt.scatter(x_data2, y_data2, c='b', label='Data Series 2') plt.legend() plt.show() 在这个例子中,`plt.scatter()`函数用于绘制两个散点图,分别使用红色和蓝色表示。`label`参数用于给每个散点图添加标签。最后,`plt.legend()`函数用于添加图例,并将其放置在默认位置。