0

假设我有一个如下所示的列表:

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)对都附有a 100、 a150或附加值。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)将第三个列表中与相同值关联的所有对移动到自己的列表中,如下所示:

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='^')

我想知道是否有一种方法可以做到这一点,而无需重新打包原始列表,然后为第三个子列表中的每个值设置几个单独的图。

4

3 回答 3

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)

这确实非常有效。

于 2013-08-29T14:04:21.317 回答
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为您拥有的每种类型的标记调用一次,而不是为每个点调用一次。

于 2013-08-29T12:52:31.200 回答
1

由于您只有三个关联值并且您知道相应的绘图值,因此将每个关联值映射到绘图值:

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]])
于 2013-08-29T12:47:13.473 回答