Matplotlib散点图,每x点2个y点

时间:2014-12-02 09:35:42

标签: python matplotlib plot

我想使用Matplotlib创建一个Scatter图。

我有一个x轴的ID数组。它看起来像这样:

x = [1, 2, 3, ...]
#Length = 418

对于y轴,我有一系列tupples。它看起来像这样:

y = [(1, 1), (1, 0), (0, 0), (0, 1), ...]
#Length = 418

我想在散点图中绘制它,以便对于每个ID(在x轴上),它显示相应tupple的第一个值的红点和对应元组的第二个值的蓝点

我试过这段代码:

plt.plot(x, y, 'o')
plt.xlim(xmin=900, xmax=1300)
plt.ylim(ymin=-1, ymax=2)
plt.yticks(np.arange(2), ('Class 0', 'Class 1'))
plt.xlabel('ID')
plt.ylabel('Class')
plt.show()

它显示了这个结果:

my_plot

如何让这个情节更清晰?

另外,当我放大时,我注意到这些点是偏移的?如何将它们直接放在彼此之上?

zoomed_plot

2 个答案:

答案 0 :(得分:3)

您需要按摩您的数据,以便您有我认为的平面列表。

最直观的方法我想要定义两个列表y1y2并循环显示原始y,并为其添加正确的值:

y1 = []
y2 = []

for i, j in y:
    y1.append(i)
    y2.append(j)

然后您可以通过两次调用plt.scatter

来绘制红色和蓝色散点图
plt.scatter(x, y1, c = 'r')
plt.scatter(x, y2, c = 'b')
希望有所帮助!

答案 1 :(得分:1)

您需要将数据存储在两个列表/元组中,而不是一个两项元组列表,因为这是plt.plot输入所需要的。最好的方法是像这样重新组织你的数据,但如果你被这个元组列表困住(或者你出于其他原因需要这种数据格式),你可以随时创建列表:

plt.plot(x, [i for (i,j) in y], 'ro')
plt.plot(x, [j for (i,j) in y], 'bo')

请注意,如果您想要两种不同颜色的不同数据线,则需要两条plt.plot(..)行。

为避免标记相互重叠,您可以更改其形状或大小(或两者):

plt.plot(x, [i for (i,j) in y], 'rs', markersize = 12 )
plt.plot(x, [j for (i,j) in y], 'bo', markeresize = 8)