代码之家  ›  专栏  ›  技术社区  ›  Aleyna Şenozan

用箱线图显示异常值

  •  0
  • Aleyna Şenozan  · 技术社区  · 4 年前

    我正在使用matplotlib绘制一个长方体图形,但缺少一些值(NaN)。然后我发现它没有在具有NaN值的列中显示方框图。 你知道怎么解决这个问题吗? 这是密码。

    import numpy as np
    import matplotlib.pyplot as plt
    
    #==============================================================================
    # open data
    #==============================================================================
    filename='C:\\Users\\liren\\OneDrive\\Data\\DATA in the first field-final\\ks.csv'
    
    AllData=np.genfromtxt(filename,delimiter=";",skip_header=0,dtype='str')
    
    TreatmentCode = AllData[1:,0]
    RepCode = AllData[1:,1]
    KsData= AllData[1:,2:].astype('float')
    DepthHeader = AllData[0,2:].astype('float')
    TreatmentUnique = np.unique(TreatmentCode)[[3,1,4,2,8,6,9,7,0,5,10],]
    nT = TreatmentUnique.size#nT=number of treatments
    #nD=number of deepth;nR=numbers of replications;nT=number of treatments;iT=iterms of treatments
    nD = 5
    nR = 6
    KsData_3D = np.zeros((nT,nD,nR)) 
    
    for iT in range(nT):
        Treatment = TreatmentUnique[iT]
    
        TreatmentFilter = TreatmentCode == Treatment
    
        KsData_Filtered = KsData[TreatmentFilter,:]
        
        KsData_3D[iT,:,:] = KsData_Filtered.transpose()iD = 4
                          
    fig=plt.figure()
    ax = fig.add_subplot(111)
    plt.boxplot(KsData_3D[:,iD,:].transpose())
    ax.set_xticks(range(1,nT+1))
    ax.set_xticklabels(TreatmentUnique)
    ax.set_title(DepthHeader[iD])
    

    这是最后一个数字,一些治疗方法缺少方框。

    enter image description here

    0 回复  |  直到 4 年前
        1
  •  20
  •   Community Mohan Dere    5 年前

    您可以删除 NaN 首先从数据中提取,然后绘制过滤后的数据。

    要做到这一点,你可以先找到 他在用什么 np.isnan(data) ,然后使用 ~ operator .用它来索引数据数组,然后过滤掉 s

    filtered_data = data[~np.isnan(data)]
    

    在一个完整的例子中(改编自 here )

    对于1D数据:

    import matplotlib.pyplot as plt
    import numpy as np
    
    # fake up some data
    spread = np.random.rand(50) * 100
    center = np.ones(25) * 50
    flier_high = np.random.rand(10) * 100 + 100
    flier_low = np.random.rand(10) * -100
    data = np.concatenate((spread, center, flier_high, flier_low), 0)
    
    # Add a NaN
    data[40] = np.NaN
    
    # Filter data using np.isnan
    filtered_data = data[~np.isnan(data)]
    
    # basic plot
    plt.boxplot(filtered_data)
    
    plt.show()
    

    对于二维数据:

    对于二维数据,不能简单地使用上面的掩码,因为这样数据数组的每一列都有不同的长度。相反,我们可以创建一个列表,列表中的每一项都是数据数组中每一列的过滤数据。

    列表理解可以在一行中完成: [d[m] for d, m in zip(data.T, mask.T)]

    import matplotlib.pyplot as plt
    import numpy as np
    
    # fake up some data
    spread = np.random.rand(50) * 100
    center = np.ones(25) * 50
    flier_high = np.random.rand(10) * 100 + 100
    flier_low = np.random.rand(10) * -100
    data = np.concatenate((spread, center, flier_high, flier_low), 0)
    
    data = np.column_stack((data, data * 2., data + 20.))
    
    # Add a NaN
    data[30, 0] = np.NaN
    data[20, 1] = np.NaN
    
    # Filter data using np.isnan
    mask = ~np.isnan(data)
    filtered_data = [d[m] for d, m in zip(data.T, mask.T)]
    
    # basic plot
    plt.boxplot(filtered_data)
    
    plt.show()
    

    我将把它作为一个练习留给读者,让他们把它扩展到3个或更多维度,但你明白了。