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

Python Matplotlib散点图,每个x点有2个y点,python,matplotlib,plot,Python,Matplotlib,Plot,我想使用Matplotlib创建散点图 我有一个x轴的ID数组。它看起来像这样: x = [1, 2, 3, ...] #Length = 418 y = [(1, 1), (1, 0), (0, 0), (0, 1), ...] #Length = 418 对于y轴,我有一个元组数组。它看起来像这样: x = [1, 2, 3, ...] #Length = 418 y = [(1, 1), (1, 0), (0, 0), (0, 1), ...] #Length = 418 我想在散

我想使用Matplotlib创建散点图

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

x = [1, 2, 3, ...]
#Length = 418
y = [(1, 1), (1, 0), (0, 0), (0, 1), ...]
#Length = 418
对于y轴,我有一个元组数组。它看起来像这样:

x = [1, 2, 3, ...]
#Length = 418
y = [(1, 1), (1, 0), (0, 0), (0, 1), ...]
#Length = 418
我想在散点图中对此进行绘制,这样对于每个ID(在x轴上),对应元组的第一个值显示一个红点,对应元组的第二个值显示一个蓝点

我尝试了以下代码:

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()
结果表明:

我如何才能让这个情节更清晰?

此外,当我放大时,我注意到点是偏移的?如何将它们直接置于彼此上方?


我认为,你需要对你的数据进行按摩,这样你就有了一个简单的列表

我认为,最直观的方法是定义两个列表,
y1
y2
,然后在原始的
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')

希望有帮助

您需要将数据存储在两个列表/元组中,而不是一个两项元组的列表中,因为这是需要作为输入的内容。最好的方法是像这样重新组织数据,但如果您一直使用此元组列表(或者出于其他原因需要此数据格式),您可以随时创建列表:

plt.plot(x, [i for (i,j) in y], 'ro')
plt.plot(x, [j for (i,j) in y], 'bo')
请注意,如果需要两条不同颜色的数据线,则需要两条
plt.plot(..)
线

要避免标记相互重叠,可以更改其形状或大小(或同时更改两个):


这对我来说是可行的,但是如何将数据点直接放在彼此的上方呢?我尝试添加
align='center'
,但这对
plt不起作用。plot
这对我有效,但如何将数据点直接放在彼此上方?我尝试添加
align='center'
,但这不适用于我的机器上的
plt.plot
,它们直接位于彼此上方。在您的屏幕截图上,似乎在元组900-908中有相同的值。在你的909元组中,有一个蓝点和一个绿点在彼此的正上方。哦,当然!我真蠢,竟然没看到这个。。是否可以使两个点中的一个比另一个大(例如蓝色点)?这样,可以在同一个地方看到两个点。最后一个问题,在我使用
plt.scatter
之前。这不知道属性
markersize
。所以我把它改为
plt.plot
。但现在,它正在用线连接点。我可以避免吗?在我的回答中,“rs”和“bo”标记定义了点不应该用线表示,而应该分别用红色正方形和蓝色圆圈表示。