更改同一组数据上的标记

时间:2013-10-25 14:18:31

标签: python matplotlib

我有一组来自两个不同来源的数据,我有多个图集在一起。所以基本上有6个带有误差条(所有不同颜色)的散点图,每个散点图有两个来源。

基本上我希望蓝色散点图有两个不同的标记'o' and's'。我目前通过使用循环单独绘制每个点并检查源是1还是2来完成此操作。如果它是1,则如果源为2则绘制's',然后绘制{{1} }。

然而,这种方法并不真正允许拥有一个传奇。 (Data1,Data2,...... Data6)

有更好的方法吗?

编辑:

我想要一个更清洁的方法,这是

'o'

x=[1,2,3]

y=[4,5,6]

m=['o','s','^']

但是这会返回错误无法识别的标记样式

4 个答案:

答案 0 :(得分:3)

更多的pythonic方式(但仍然是循环)可能类似于

x=[1,2,3]
y=[4,5,6]
l=['data1','data2','data3']
m=['ob','sb','^b']
f,a = plt.subplots(1,1)
[a.plot(*data, label=lab) for data,lab in zip(zip(x,y,m),l)]
plt.legend(loc='lower right')
plt.xlim(0,4)
plt.ylim(3,7);

enter image description here

但我想如果你有很多数据点,这不是最有效的方式。

如果您想使用scatter尝试类似

的内容
m=['o','s','^']
f,a = plt.subplots(1,1)
[a.scatter(*data, marker=m1, label=l1) for data,m1,l1 in zip(zip(x,y),m,l)]

enter image description here

我很确定,此处也可以应用**和dicts。

<强>更新
matplotlib的绘图函数能够读取任意数量的x,y,fmt组,而不是循环绘图命令,请参阅docs

x=np.random.random((3,6))
y=np.random.random((3,6))
l=['data1','data2','data3']
m=['ob','sb','^b']
plt.plot(*[i[j] for i in zip(x,y,m) for j in range(3)])
plt.legend(l,loc='lower right')

答案 1 :(得分:2)

循环调用绘图很好。你只需要保留plot返回的行列表,并使用fig.legend为整个图形创建一个图例。见http://matplotlib.org/examples/pylab_examples/figlegend_demo.html

答案 2 :(得分:2)

借调到@tcaswell的评论,.scatter()返回collections.PathCollection,这提供了一种快速绘制大量相同形状对象的方法。您可以使用循环将数据绘制为多个散点图(以及许多不同的数据集),但在我看来,它会失去.scatter()提供的所有速度优势。

说到这些,然而在散点图中点必须是相同的。您可以使用不同的linewidthedgecolor和其他许多内容。但点必须是相同的形状。请参阅此示例,指定不同的颜色(并且仅绘制一个数据集):

>>> sc=plt.scatter(x, y, label='test')
>>> sc.set_color(['r','g','b'])
>>> plt.legend()

请参阅http://matplotlib.org/api/collections_api.html中的详细信息。

enter image description here

答案 3 :(得分:-1)

这些都没问题,但并不是我想要的。问题是我如何解析我的数据以及如何添加一个图例不会搞砸了。由于我做了一个for循环并根据是否在观察位置1或2测量每个点单独绘制每当我做一个图例时它将绘制超过50个图例条目。因此,我将数据绘制为全套(不可见且没有符号变化),然后使用变化的符号再次将颜色绘制成颜色。这效果更好。谢谢