我想创建一个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)
答案 0 :(得分:12)
首先,我觉得你想要使用撇号,而不是在声明颜色时使用反引号。
对于传奇,你需要一些形状和类。例如,以下内容为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)
如果您愿意,也可以使用圈子,只需查看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)
第一种方法是我亲自使用的方法,第二种方法是我刚看到的matplotlib文档。由于传说覆盖了数据点,我移动了它们,并且可以找到传说的位置here。如果还有另一种制作传奇的方法,那么在文档中进行一些快速搜索之后,我就无法找到它。
答案 1 :(得分:5)
有两种方法可以做到这一点。其中一个为您绘制的每件事物提供了图例条目,另一个允许您在图例中放置您想要的任何内容,从this答案中大量窃取。
这是第一种方式:
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()
ax.legend()
函数有多个用法,第一个只根据axes
对象中的行创建图例,第二个是你手动控制条目,并描述{{3 }}
您基本上需要为图例指定线条处理和相关标签。
另一种方式允许您通过创建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()
或者在这里,我们创建新的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()
我也尝试使用patches
来使用该方法,就像在matplotlib图例指南页面上一样,但它似乎没有用,所以我放弃了。
答案 2 :(得分:2)
这在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()
答案 3 :(得分:1)
在我的项目中,我还想创建一个空的分散图例。这是我的解决方案:
from mpl_toolkits.basemap import Basemap
#use the scatter function from matplotlib.basemap
#you can use pyplot or other else.
select = plt.scatter([], [],s=200,marker='o',linewidths='3',edgecolor='#0000ff',facecolors='none',label=u'监测站点')
plt.legend(handles=[select],scatterpoints=1)
注意上面的“标签”,“散点”。
答案 4 :(得分:0)
如果您使用的是matplotlib 3.1.1或更高版本,则可以尝试:
{
"data": [
{
"0": {
"id": 1,
"name": "aaa",
"count": 2
},
"1": {
"id": 2,
"name": "bbb",
"count": 3
},
"2": {
"id": 3,
"name": "ccc",
"count": 1
}
}
]
}
此外,要用类名替换标签, 我们只需要来自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', '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())
答案 5 :(得分:0)
您还可以使用带有内置颜色图(来自 matplotlib)的 seaborn。
import seaborn as sb
x = [1, 3, 4, 6, 7, 9]
y = [0, 0, 5, 8, 8, 8]
classes = ['A', 'A', 'B', 'C', 'C', 'C']
sb.scatterplot(
x=x, y=y, hue=classes,
legend="full", palette="rainbow"
)
# colormap used is "rainbow"
您可以从 Matplotlib colormap catalogue 中找到其他颜色图。