根据列表中的值设置绘图中的标记

时间:2013-08-29 12:20:40

标签: python matplotlib plot

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

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)对都附加了100150200值。

我想在散点图中绘制这些(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='^')

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

3 个答案:

答案 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]])