【问题标题】:matplotlib 3D scatter plot with legendmatplotlib 3D 散点图与图例
【发布时间】:2021-09-27 10:59:08
【问题描述】:

我有一个 3 列 16 行的表格。我想创建一个 3D 绘图以将每一行可视化为绘图上的标记。为此,我使用第一列作为 X,第二列作为 Y,第三列作为 Z。 数据看起来像这样:

>>> print(data.head())

                            Penicilin  Streptomycin   Neomycin Gram Staining 
Bacteria                                                                     
Aerobacter aerogenes            870.0            1.0      1.60       negative
Brucella abortus                  1.0            2.0      0.02       negative
Escherichia coli                100.0            0.4      0.10       negative
Klebsiella pneumoniae           850.0            1.2      1.00       negative
Mycobacterium tuberculosis      800.0            5.0      2.00       negative

我用这段代码来绘制数据:

fig = plt.figure()
ax = fig.add_subplot(projection='3d')

ax.scatter(X, Y, Z, label=data.index.values, marker='o' )


ax.set_xlabel('Penicilin')
ax.set_ylabel('Streptomycin')
ax.set_zlabel('Neomycin')
ax.legend()
plt.show()

3D 绘图是正确的,但问题出在图例上。

问题

我希望图中的每个点都可以与其他点区分开来,以便用户可以了解每个点是哪种细菌。

如何为每一行数据框设置不同的标记,甚至为它设置不同的颜色?传说也不清楚。

【问题讨论】:

    标签: python pandas dataframe matplotlib mplot3d


    【解决方案1】:

    通过将标记和数据绘制为一条线,您可以绘制散点图,每个标记都有不同的标记。

    import matplotlib.pyplot as plt
    
    fig = plt.figure()
    ax = fig.add_subplot(projection='3d')
    
    markers = ['o','^','x','>','<']
    for idx, row in data.iterrows():
    #     print(idx,row)
        ax.scatter(row['Penicilin'], row['Streptomycin'], row['Neomycin Gram'], label=row['Bacteria'], marker=markers[idx])
    
    ax.set_xlabel('Penicilin')
    ax.set_ylabel('Streptomycin')
    ax.set_zlabel('Neomycin')
    ax.legend(loc='upper left', bbox_to_anchor=(1.15, 1.0))
    plt.show()
    

    【讨论】: