我有一组来自两个不同来源的数据,我有多个图集在一起。所以基本上有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','^']
但是这会返回错误无法识别的标记样式
答案 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);
但我想如果你有很多数据点,这不是最有效的方式。
如果您想使用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)]
我很确定,此处也可以应用**
和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()
提供的所有速度优势。
说到这些,然而在散点图中点必须是相同的。您可以使用不同的linewidth
,edgecolor
和其他许多内容。但点必须是相同的形状。请参阅此示例,指定不同的颜色(并且仅绘制一个数据集):
>>> sc=plt.scatter(x, y, label='test')
>>> sc.set_color(['r','g','b'])
>>> plt.legend()
请参阅http://matplotlib.org/api/collections_api.html中的详细信息。
答案 3 :(得分:-1)
这些都没问题,但并不是我想要的。问题是我如何解析我的数据以及如何添加一个图例不会搞砸了。由于我做了一个for循环并根据是否在观察位置1或2测量每个点单独绘制每当我做一个图例时它将绘制超过50个图例条目。因此,我将数据绘制为全套(不可见且没有符号变化),然后使用变化的符号再次将颜色绘制成颜色。这效果更好。谢谢