Kar*_*rus 22 python matplotlib legend
我想创建一个Matplotlib散点图,其中一个图例显示每个类的颜色.例如,我有一个x和y值列表,以及一个classes值列表.在每个元素x,y并classes列出了对应于一个情节点.我希望每个类都有自己的颜色,我已编码,但后来我希望类在图例中显示.我将哪些参数传递给legend()函数来实现这一目标?
到目前为止,这是我的代码:
x = [1, 3, 4, 6, 7, 9]
y = [0, 0, 5, 8, 8, 8]
classes = ['A', 'A', 'B', 'C', 'C', 'C']
colours = ['r', 'r', 'b', 'g', 'g', 'g']
plt.scatter(x, y, c=colours)
Run Code Online (Sandbox Code Playgroud)
The*_*hwa 14
首先,我有一种感觉,你想要使用撇号,而不是在声明颜色时使用反引号.
对于一个传奇,你需要一些形状和类.例如,以下内容创建了一个recs为每种颜色调用的矩形列表class_colours.
import matplotlib.patches as mpatches
classes = ['A','B','C']
class_colours = ['r','b','g']
recs = []
for i in range(0,len(class_colours)):
recs.append(mpatches.Rectangle((0,0),1,1,fc=class_colours[i]))
plt.legend(recs,classes,loc=4)
Run Code Online (Sandbox Code Playgroud)

如果需要,您也可以使用圈子,只需查看matplotlib.patches文档.还有第二种创建图例的方法,在其中为每组使用单独的散布命令为一组点指定"标签".下面给出一个例子.
classes = ['A','A','B','C','C','C']
colours = ['r','r','b','g','g','g']
for (i,cla) in enumerate(set(classes)):
xc = [p for (j,p) in enumerate(x) if classes[j]==cla]
yc = [p for (j,p) in enumerate(y) if classes[j]==cla]
cols = [c for (j,c) in enumerate(colours) if classes[j]==cla]
plt.scatter(xc,yc,c=cols,label=cla)
plt.legend(loc=4)
Run Code Online (Sandbox Code Playgroud)

第一种方法是我亲自使用的方法,第二种方法是我刚看到的matplotlib文档.由于传说涵盖了数据点,我移动了它们,并且可以在这里找到传说的位置.如果还有另一种制作传奇的方法,我在文档中进行了几次快速搜索后无法找到它.
Oli*_*erQ 11
如果您使用的是 matplotlib 3.1.1 或更高版本,您可以尝试:
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
x = [1, 3, 4, 6, 7, 9]
y = [0, 0, 5, 8, 8, 8]
classes = ['A', 'A', 'B', 'C', 'C', 'C']
values = [0, 0, 1, 2, 2, 2]
colours = ListedColormap(['r','b','g'])
scatter = plt.scatter(x, y,c=values, cmap=colours)
plt.legend(*scatter.legend_elements())
Run Code Online (Sandbox Code Playgroud)
此外,为了用类名替换标签,我们只需要来自 scatter.legend_elements 的句柄:
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
x = [1, 3, 4, 6, 7, 9]
y = [0, 0, 5, 8, 8, 8]
classes = ['A', 'B', 'C']
values = [0, 0, 1, 2, 2, 2]
colours = ListedColormap(['r','b','g'])
scatter = plt.scatter(x, y,c=values, cmap=colours)
plt.legend(handles=scatter.legend_elements()[0], labels=classes)
Run Code Online (Sandbox Code Playgroud)
有两种方法可以做到这一点.其中一人给你图例项的每一件事情,你的情节,另外一个可以让你把你想要的任何传说,从大量窃取这个答案.
这是第一种方式:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1,1,100)
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
#Plot something
ax.plot(x,x, color='red', ls="-", label="$P_1(x)$")
ax.plot(x,0.5 * (3*x**2-1), color='green', ls="--", label="$P_2(x)$")
ax.plot(x,0.5 * (5*x**3-3*x), color='blue', ls=":", label="$P_3(x)$")
ax.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

该ax.legend()函数有多个用途,第一个只是根据axes对象中的行创建图例,第二个是手动控制条目,这里描述.
您基本上需要为图例提供线条处理和相关标签.
另一种方法允许您通过创建Artist对象和标签并将它们传递给ax.legend()函数,在图例中放置您想要的任何内容.您可以使用此选项仅将某些行放入图例中,也可以使用它在图例中放置您想要的任何内容.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1,1,100)
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
#Plot something
p1, = ax.plot(x,x, color='red', ls="-", label="$P_1(x)$")
p2, = ax.plot(x,0.5 * (3*x**2-1), color='green', ls="--", label="$P_2(x)$")
p3, = ax.plot(x,0.5 * (5*x**3-3*x), color='blue', ls=":", label="$P_3(x)$")
#Create legend from custom artist/label lists
ax.legend([p1,p2], ["$P_1(x)$", "$P_2(x)$"])
plt.show()
Run Code Online (Sandbox Code Playgroud)

或者在这里,我们创建新Line2D对象,并将它们传递给图例.
import matplotlib.pyplot as pltit|delete|flag
import numpy as np
import matplotlib.patches as mpatches
x = np.linspace(-1,1,100)
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
#Plot something
p1, = ax.plot(x,x, color='red', ls="-", label="$P_1(x)$")
p2, = ax.plot(x,0.5 * (3*x**2-1), color='green', ls="--", label="$P_2(x)$")
p3, = ax.plot(x,0.5 * (5*x**3-3*x), color='blue', ls=":", label="$P_3(x)$")
fakeLine1 = plt.Line2D([0,0],[0,1], color='Orange', marker='o', linestyle='-')
fakeLine2 = plt.Line2D([0,0],[0,1], color='Purple', marker='^', linestyle='')
fakeLine3 = plt.Line2D([0,0],[0,1], color='LightBlue', marker='*', linestyle=':')
#Create legend from custom artist/label lists
ax.legend([fakeLine1,fakeLine2,fakeLine3], ["label 1", "label 2", "label 3"])
plt.show()
Run Code Online (Sandbox Code Playgroud)

我也尝试使用该方法patches,就像在matplotlib图例指南页面上一样,但它似乎没有用,所以我放弃了.
这在seaborn 的散点图中很容易处理。这是它的一个实现。
import matplotlib.pyplot as plt
import seaborn as sns
x = [1, 3, 4, 6, 7, 9]
y = [0, 0, 5, 8, 8, 8]
classes = ['A', 'A', 'B', 'C', 'C', 'C']
colours = ['r', 'r', 'b', 'g', 'g', 'g']
sns.scatterplot(x=x, y=y, hue=classes)
plt.show()
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
47413 次 |
| 最近记录: |