好,所以我试图创建一个散点图,每个点包含4条信息,x和y数据,标记样式和颜色。
所以我有一个元组列表,其中包含诸如(string1,string2,float,int)之类的数据
为了提供一些背景信息,我的数据是一个像这样的元组列表:
new_data = [('Alice','A',0.1,100),('Bob','B',0.2,200)....]
大约有100点,但名称少于100个(爱丽丝·鲍勃(Alice Bob)等),字母少于100个(A B等)。
我的计划是让每个数据点都参考这样的图形:
(marker,x_axis,y_axis,colour)
因此,我已经设法完成了几乎所有这些操作(使用了一些循环的东西),除了创建了一个我无法使用的彩条(并且它开始让我觉得我对这一切都错了)。我尝试了一些更复杂的方法来获取颜色条,但我认为这里应该显示最简单的方法。
cols = [x[3] for x in new_data]
#all the values i want to use for the colours
poss_cols = np.linspace(min(cols),max(cols),max(cols)-min(cols)+1)
#not every number in the range exists in my data, so these are the
possible ones
col_range = cm.rainbow(np.linspace(0,1,max(cols)-min(cols)+1))
#create the colourmap
col_dict = {k:v for k,v in zip(poss_cols,col_range)}
#this seemed the only sensible way to link the arbitrary int i have to a color array (i could easily be making this more complicated though)
names = list(set([x[0] for x in new_data]))
#all unique names (there are 9)
markers = ['.','2','v','^','<','>','s','*','x']
mark_dict = {k:v for k,v in zip(names,markers)}
plt.figure()
for name,mark in mark_dict.items():
x_data = [x[1] for x in new_data if x[0] == sub]
y_data = [x[2] for x in new_data if x[0] == sub]
colours = [x[3] for x in new_data if x[0] == sub]
for x,y,c in zip(x_data,y_data,colours):
plt.scatter(x,y,marker=mark,color=col_dict[c])
plt.colorbar(ax=plt.gca())
这给了我这个错误:
TypeError: You must first set_array for mappable
我不太了解。我还看到了其他示例,人们将plt.scatter()分配给变量并将其传递给颜色栏,但这似乎对我不起作用(我猜测是因为该变量在每次迭代中都会重新定义)>
另一个问题是,颜色栏上的刻度线应在原始值的范围内(例如100到300),而不是1到0,但是我可能可以自己弄清楚。
在这一点上,我开始认为这不是创建该图的最佳方法,因此欢迎提出任何想法!