我在matplotlib中有一个三维图,输入数据由3个x,y,z坐标列表和一个标签列表组成,这些标签指示每个坐标集所属的类。从标签我创建一个颜色列表,然后为每个坐标分配颜色。:
x_cords = projected_train[:,0]
y_cords = projected_train[:,1]
z_cords = projected_train[:,2]
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
colors = ['#008080',...,'#000000']
plotlabels = ['Acer campestre L',...,'Viburnum tinus']
#Creating colorlist from labels indexes
colors = np.asarray(colors)
colorslist = colors[labels]
ax.scatter(x_cords, y_cords, z_cords, color=colorslist)
plt.show()
标签列表的创建方式与颜色列表相同:
labels = np.asarray(labels)
plotlabelslist = plotlabels[labels]
但是当我将标签添加到情节中时:
ax.scatter(x_cords, y_cords, z_cords, color=colorslist, label=plotlabelslist)
plt.legend(loc='upper left')
我得到以下结果:
我尝试过添加标签的其他方法但没有任何运气,是否有任何方法可以添加标签列表,就像添加颜色一样,或者我必须逐个绘制每个类并添加标签,比如:How to get different colored lines for different plots in a single figure?
的答案任何对正确方向的帮助或推动都会非常感激!
答案 0 :(得分:2)
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
x_cords = [1,2,4,2,5,3,2,5,3,4,6,2,3,4,5,3,4,2,4,5]
y_cords = [6,5,3,4,5,6,3,5,4,6,3,4,5,6,3,4,5,6,3,4]
z_cords = [3,1,3,4,2,4,5,6,3,4,5,6,2,4,5,7,3,4,5,6]
classlbl= [0,2,0,1,2,0,2,0,1,2,0,1,0,2,0,2,0,1,0,2]
colors = ['r','g','b']
Labels = ['RED','GREEN','BLUE']
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
#plotlabels = ['Acer campestre L',...,'Viburnum tinus']
#Creating colorlist from labels indexes
colors = np.asarray(colors)
colorslist = colors[classlbl]
Labels = np.asarray(Labels)
labellist = Labels[classlbl]
# Plot point by point
for x,y,z,c,l in zip(x_cords, y_cords, z_cords,colorslist,labellist):
ax.scatter(x, y, z, color=c,label=l)
# Get the labels and handles
handles, labels = ax.get_legend_handles_labels()
# Filter the labels and handles to remove duplicates
newLeg=dict()
for h,l in zip(handles,labels):
if l not in newLeg.keys():
newLeg[l]=h
# Create new handles and labels
handles=[]
labels=[]
for l in newLeg.keys():
handles.append(newLeg[l])
labels.append(l)
# Create new Legend
ax.legend(handles, labels)
plt.show()