代码之家  ›  专栏  ›  技术社区  ›  Linda

不同数据帧的并排熊猫箱线图

  •  2
  • Linda  · 技术社区  · 6 年前

    尽管网上有很多关于并排绘制箱线图的好例子。由于我的数据被设置在两个不同的pandas数据框中,而allready有sum子图,我无法使箱线图彼此相邻,而不是重叠。

    我的代码如下:

    import matplotlib as mpl
    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np
    mpl.use('agg')
    
    fig, axarr = plt.subplots(3,sharex=True,sharey=True,figsize=(9,6))
    month = ['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec']
    percentiles = [90,95,98]
    nr = 0
    for p in percentiles:  
        future_data = pd.DataFrame(np.random.randint(0,30,size=(30,12)),columns = month)
        present_data = pd.DataFrame(np.random.randint(0,30,size=(30,12)),columns = month)
    
        Future = future_data.as_matrix()
        Present = present_data.as_matrix()      
    
        pp = axarr[nr].boxplot(Present,patch_artist=True, showfliers=False)   
        fp = axarr[nr].boxplot(Future, patch_artist=True, showfliers=False)
    
        nr += 1           
    

    结果如下所示: Overlapping Boxplots

    你能帮我确定这些盒子是相邻的,这样我就可以比较它们而不必担心重叠了吗?

    非常感谢。

    编辑:我已经减少了一些代码,以便它可以像这样运行。

    1 回复  |  直到 6 年前
        1
  •  5
  •   ImportanceOfBeingErnest    6 年前

    您需要手动定位条,即将位置作为数组提供给 position 箱线图的参数。在这里,将一个移动-0.2,另一个移动+0.2到其整数位置是有意义的。然后可以调整它们的宽度,使其总和小于位置差。

    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np
    
    fig, axarr = plt.subplots(3,sharex=True,sharey=True,figsize=(9,6))
    month = ['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec']
    percentiles = [90,95,98]
    nr = 0
    for p in percentiles:  
        future_data = pd.DataFrame(np.random.randint(0,30,size=(30,12)),columns = month)
        present_data = pd.DataFrame(np.random.randint(0,30,size=(30,12)),columns = month)
    
        Future = future_data.as_matrix()
        Present = present_data.as_matrix()      
    
        pp = axarr[nr].boxplot(Present,patch_artist=True, showfliers=False, 
                               positions=np.arange(Present.shape[1])-.2, widths=0.4)   
        fp = axarr[nr].boxplot(Future, patch_artist=True, showfliers=False,
                               positions=np.arange(Present.shape[1])+.2, widths=0.4)
    
        nr += 1  
    
    axarr[-1].set_xticks(np.arange(len(month)))
    axarr[-1].set_xticklabels(month)
    axarr[-1].set_xlim(-0.5,len(month)-.5)
    
    plt.show()
    

    enter image description here