【问题标题】:Matplotlib scatter plot with 2 y-points per x-pointMatplotlib 散点图,每个 x 点有 2 个 y 点
【发布时间】:2014-12-02 09:35:41
【问题描述】:

我想使用 Matplotlib 创建散点图。

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

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

对于 y 轴,我有一个元组数组。它看起来像这样:

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

它显示了这个结果:

如何让这个情节更清晰?

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

【问题讨论】:

    标签: python matplotlib plot


    【解决方案1】:

    我认为你需要整理你的数据,以便拥有平面列表。

    我认为最直观的方法是定义两个列表,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')
    

    希望有帮助!

    【讨论】:

    • 这对我有用,但我怎样才能将数据点直接放在彼此之上?我尝试添加align='center',但这不适用于plt.plot
    【解决方案2】:

    您需要将数据存储在两个列表/元组中,而不是一个包含两项元组的列表中,因为这是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)
    

    【讨论】:

    • 这对我有用,但我怎样才能将数据点直接放在彼此之上?我尝试添加align='center',但这不适用于plt.plot
    • 在我的机器上,它们直接在彼此之上。在您的屏幕截图上,您似乎在元组 900-908 中具有相同的值。在您的元组 909 中,正上方有一个蓝色和一个绿色点。
    • 哦,当然!愚蠢的我没有看到这个..是否可以使两个点中的一个比另一个大(例如蓝点)?这样,就有可能在同一个地方看到 2 个点。
    • 最后一个问题,在我使用plt.scatter 之前。这不知道属性markersize。所以我把它改成了plt.plot。但现在,它正在将点与线连接起来。我可以避免这种情况吗?
    • 在我的回答中,“rs”和“bo”标签定义了点不应用线表示,而应分别用红色方块和蓝色圆圈表示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2021-01-25
    • 2016-01-22
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多