代码之家  ›  专栏  ›  技术社区  ›  Christin Abel

从数据帧中的数组生成散点图

  •  1
  • Christin Abel  · 技术社区  · 6 年前

    假设我有以下数据帧,每个月我有一堆数据,存储在三个变量的数组中:

    ID         Y        X1        X2  month
    0   [2,4,6,8] [2,4,6,8] [2,4,6,8]    01
    1   [Nan,4,6,8] [1,3,5,4] [4,3,3,3]  02
    2   [3,4,5,6] [1,9,7,7] [2,2,6,Nan]  03
    3   [1,2,3,4] [5,6,7,8] [9,9,Nan,6]  04
    4   [2,4,6,8] [2,4,6,8] [2,4,6,8]    05
    


    我最终要做的是在Y和X1之间做一个散点图,01个月用深蓝色标记,2个月用浅蓝色标记,以此类推。也许我也想要Y和X2的散点图,在同一个图中用不同深浅的红色。。
    我试过这个:

    df.iloc[0:1].plot.scatter(x = 'X1', y='Y')
    


    Nan值有问题吗???

    有什么主意吗?!非常感谢你的帮助!

    1 回复  |  直到 6 年前
        1
  •  1
  •   Lukas Humpe    6 年前

    您需要更改数据帧的结构:

    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np
    
    
    data =  {"ID":[0,1,2,3,4],
             "Y":[np.array([2,4,6,8]), 
                  np.array([np.nan,4,6,8]),
                  np.array([3,4,5,6]), 
                  np.array([1,2,3,4]), 
                  np.array([2,4,6,8])],
            "X1":[np.array([2,4,6,8]), 
                  np.array([1,2,5,4]),
                  np.array([1,9,7,7]), 
                  np.array([5,6,7,8]), 
                  np.array([2,4,6,8])],
            "X2":[np.array([2,4,6,8]), 
                  np.array([4,3,3,3]),
                  np.array([2,2,6,np.nan]), 
                  np.array([9,9,np.nan,6]), 
                  np.array([2,4,6,8])],
            "month":[1,2,3,4,5]
    }
    
    
    df = pd.DataFrame(data)
    
    check = 0
    for v in range(len(df["Y"])):
        val_y = df["Y"][v]
        val_x1 = df["X1"][v]
        val_x2 = df["X2"][v]
        ID = df["ID"][v]
        month = df["month"][v]
    
        if check == 0:
            helper_dat = {"ID":ID,"Y":list(val_y),"X1":list(val_x1),"X2":list(val_x2),"month":month}
            new_df = pd.DataFrame(helper_dat)
        else:
            helper_dat = {"ID":ID,"Y":list(val_y),"X1":list(val_x1),"X2":list(val_x2),"month":month}
            helper = pd.DataFrame(helper_dat)
            new_df = new_df.append(helper,ignore_index=True)   
        check += 1
    

        ID    Y  X1   X2  month
    0    0  2.0   2  2.0      1
    1    0  4.0   4  4.0      1
    2    0  6.0   6  6.0      1
    3    0  8.0   8  8.0      1
    4    1  NaN   1  4.0      2
    5    1  4.0   2  3.0      2
    6    1  6.0   5  3.0      2
    7    1  8.0   4  3.0      2
    8    2  3.0   1  2.0      3
    9    2  4.0   9  2.0      3
    10   2  5.0   7  6.0      3
    11   2  6.0   7  NaN      3
    12   3  1.0   5  9.0      4
    13   3  2.0   6  9.0      4
    14   3  3.0   7  NaN      4
    15   3  4.0   8  6.0      4
    16   4  2.0   2  2.0      5
    17   4  4.0   4  4.0      5
    18   4  6.0   6  6.0      5
    19   4  8.0   8  8.0      5
    

    现在很容易绘制值:

    plt.scatter(new_df["X1"],new_df["Y"],c=new_df["month"], marker='^',label="X1")
    plt.scatter(new_df["X2"],new_df["Y"],c=new_df["month"], marker='o',label="X2")
    plt.legend()
    

    enter image description here

    编辑:

    plt.scatter(new_df[**new_df["month"]==4]["X1"]**,new_df[new_df["month"]==4]["Y"], marker='^',label="X1")
    plt.scatter(new_df[new_df["month"]==4]["X2"],new_df[new_df["month"]==4]["Y"], marker='o',label="X2")
    

    Answer :

    sc = plt.scatter(new_df["X1"],new_df["Y"],c=new_df["month"], marker='^',label="X1")
    plt.scatter(new_df["X2"],new_df["Y"],c=new_df["month"], marker='o',label="X2")
    lp = lambda i: plt.plot([],color=sc.cmap(sc.norm(i)),
                            label="Month {:g}".format(i))[0]
    handles = [lp(i) for i in np.unique(new_df["month"])]
    plt.legend(handles=handles,bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
    plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
    plt.show()
    

    enter image description here

    推荐文章