matplotlib c中每种颜色的图例散点图

moiiocjp  于 2023-05-18  发布在  其他
关注(0)|答案(5)|浏览(138)

我想创建一个Matplotlib散点图,其中有一个图例显示每个类的颜色。例如,我有xy值的列表,以及classes值的列表。xyclasses列表中的每个元素对应于图中的一个点。我希望每个类都有自己的颜色,我已经编码过了,但我希望这些类在图例中显示。要实现这个目标,我需要传递哪些参数给legend()函数?
以下是我目前为止的代码:

import matplotlib.pyplot as plt
x = [1, 3, 4, 6, 7, 9]
y = [0, 0, 5, 8, 8, 8]
classes = ['A', 'A', 'B', 'C', 'C', 'C']
colors = ['r', 'r', 'b', 'g', 'g', 'g']
plt.scatter(x, y, c=colors)
plt.show()
eqfvzcg8

eqfvzcg81#

首先,我感觉你的意思是在声明颜色时使用撇号,而不是反勾号。
对于图例,您需要一些形状以及类。例如,下面为class_colours中的每种颜色创建一个名为recs的矩形列表。

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)

还有第二种创建图例的方法,在该方法中,您可以为一组点使用单独的散点命令指定“标签”。下面给出一个例子。

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文档时发现的。由于图例覆盖了数据点,我移动了它们,图例的位置可以在这里找到。如果有其他方法来创造一个传奇,我无法找到后,快速搜索了几次文件。

gt0wga4j

gt0wga4j2#

如果你使用的是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())

此外,要用类名称替换标签,我们只需要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)

clj7thdc

clj7thdc3#

有两种方法。其中一个为你绘制的每件事提供图例条目,另一个让你在图例中添加任何你想要的内容,从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对象中的行创建图例,第二种用途是让你手动控制条目,这里有介绍。
您基本上需要为图例提供线手柄和相关标签。
另一种方法允许您在图例中放置任何您想要的东西,方法是创建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图例指南页面上一样,但似乎不工作,所以我放弃了。

xnifntxz

xnifntxz4#

这在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()

toe95027

toe950275#

在我的项目中,我还想创建一个空的散点图例。下面是我的解决方案:

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)

注意上面的“标签”、“散点”。

相关问题