-1

我有一组来自两个不同来源的数据,并且我有多个数据集一起绘制。所以本质上是 6 个带有误差线的散点图(所有不同的颜色),每个散点图都有两个来源。

基本上我希望蓝色散点图有两个不同的标记,'o' and's'. 我目前已经通过使用循环单独绘制每个点并检查源是 1 还是 2 来做到这一点。如果源是 1,它会绘制 a's'如果源是 2,那么它会绘制 a 'o'

然而,这种方法并没有真正允许有一个图例。(数据 1、数据 2、...数据 6)

有没有更好的方法来做到这一点?

编辑:

我想要一个更清洁的方法,类似于

x=[1,2,3]

y=[4,5,6]

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

plt.scatter(x,y,marker=m)

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

4

4 回答 4

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

在此处输入图像描述

我很确定,这里也有可能申请**和听写。

更新:
matplotlib 的 plot 函数可以读取任意数量的 x,y,fmt 组,而不是循环 plot 命令,请参阅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')
于 2013-10-25T16:32:10.240 回答
2

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

于 2013-10-25T14:42:46.707 回答
2

借用@tcaswell 的评论,.scatter()returns 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中的详细信息。

在此处输入图像描述

于 2013-10-25T17:56:28.363 回答
-1

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

于 2013-10-31T14:10:05.983 回答