假设我有一个如下所示的列表:
list_a = [[1.2, 0.5, 3.1,...], [7.3, 1.5, 3.9,...], [100, 200, 150, ...]]
该列表中的第一个和第二个子列表定义了我想要绘制的(x, y)
值。 第三子列表包含与每个(x, y)
点相关联的值(例如某个属性)。这些关联值只能是以下三个值之一:100, 150, 200
;这意味着每个(x, y)
对都附加了100
,150
或200
值。
我想在散点图中绘制这些(x, y)
点,但是根据第三个列表中的值为每个点添加一个标记。
所以,我想要例如(当然不是真正的代码):
if list_a[2][item] == 100 then use marker = 'o' (circle marker)
if list_a[2][item] == 150 then use marker = 's' (square marker)
if list_a[2][item] == 200 then use marker = '^' (triangle_up marker)
我能想到的唯一方法就是重新打包list_a
,以便将与第三个列表中相同值相关联的所有(x, y)
对移动到自己的列表中,如下所示: / p>
list_100 =[[subset of x values], [subset of y values]]
list_150 =[[subset of x values], [subset of y values]]
list_200 =[[subset of x values], [subset of y values]]
然后分别绘制每个列表,每次都设置适当的标记:
plot.scatter(list_100[0], list_100[1], marker='o')
plot.scatter(list_150[0], list_150[1], marker='s')
plot.scatter(list_200[0], list_200[1], marker='^')
我想知道是否有办法这样做,而无需重新打包原始列表,然后为第三个子列表中的每个值设置几个单独的图。
答案 0 :(得分:3)
使用此:
list_a = [[1.2, 0.5, 3.1,...], [7.3, 1.5, 3.9,...], [100, 200, 150, ...]]
import numpy as np
x = np.asarray(list_a[0])
y = np.asarray(list_a[1])
m = np.asarray(list_a[2])
mrk = {100:'o',150:'s',200:'^'}
for key,value in mrk.items():
s1 = (m==key)
plt.scatter(x[s1],y[s1],marker=value)
实际上,这非常有效。
答案 1 :(得分:2)
会这样吗?它会重新排列您的列表,因此它不如您可能想要的那样高效,但我认为它对您有效。
list_a = [[1.2, 0.5, 3.1, 4.0, 2.3, 6.7],
[7.3, 1.5, 3.9, 2.7, 1.4, 9.1],
[100, 200, 150, 200, 100, 100]]
markers = [(100, 'o'), (150, 's'), (200, '^')]
list_r = zip(*list_a)
for value, marker in markers:
def f(p):
return p[2] == value
sublist_r = filter(f, list_r)
sublist = zip(*sublist_r)
plot.scatter(sublist[0], sublist[1], marker=marker)
优于@roshan较小解决方案的优势在于,它为您拥有的每种类型的标记调用plot.scatter
一次,而不是每次都调用一次。
答案 2 :(得分:1)
由于您只有三个关联值且您知道相应的绘图值, 所以将每个相关值映射到plot-value:
plot_map = { 100:'o' ,150:'s' , 200:'^' }
现在,因为每个子列表都具有相同的元素:
for i in range(len(list_a[0])):
plot.scatter(list_a[0][i], list_a[1][i], plot_map[list_a[2][i]])