与Python matplotlib并排绘制3个箱形图时出现索引不足错误

问题描述

我正在尝试并排生成3个箱形图,每个箱形图具有不同的颜色。 下面的代码显示了我的尝试,但是我遇到了这种异常的“索引不足”错误。 似乎第3个箱形图的fliers的索引指定错误,但是我不确定如何解决它,因为我试图并排绘制3个箱形图 有人可以告诉我如何避免此错误吗?

谢谢

from matplotlib.pyplot import (plot,savefig,xlim,figure,ylim,legend,Boxplot,setp,axes,xlabel,ylabel,xticks,axvline)

success_list_data=[[1.,2.,3.,4.,5.],[1.,5.]]

# function for setting the colors of the Box plots pairs
def setBoxColors(bp):
    setp(bp['Boxes'][0],color='red')
    setp(bp['caps'][0],color='red')
    setp(bp['caps'][1],color='red')
    setp(bp['whiskers'][0],color='red')
    setp(bp['whiskers'][1],color='red')
    setp(bp['fliers'][0],color='red')
    setp(bp['fliers'][1],color='red')
    setp(bp['medians'][0],color='red')

    setp(bp['Boxes'][1],color='green')
    setp(bp['caps'][2],color='green')
    setp(bp['caps'][3],color='green')
    setp(bp['whiskers'][2],color='green')
    setp(bp['whiskers'][3],color='green')
    setp(bp['fliers'][2],color='green')
    setp(bp['fliers'][3],color='green')
    setp(bp['medians'][1],color='green')
    
    setp(bp['Boxes'][2],color='purple')
    setp(bp['caps'][4],color='purple')
    setp(bp['caps'][5],color='purple')
    setp(bp['whiskers'][4],color='purple')
    setp(bp['whiskers'][5],color='purple')
    setp(bp['fliers'][4],color='purple')
    setp(bp['fliers'][5],color='purple')
    setp(bp['medians'][2],color='purple')

def make_Boxplots(success_list_data):

    fig = figure()
    ax = axes()

    bp = Boxplot(success_list_data,positions = [1,2,3],widths = 0.6)
    setBoxColors(bp)
    
        # label the x-ticks.
    plt.xticks([1,['Delta','Diag. normal','Laplace'])
    
    # label for the x-axis.
    plt.xlabel('Guide Type')
    # label for the y-axis.
    plt.ylabel('Test Success Rate')

# this generates an error
>>> make_Boxplots(success_list_data)
>>> Traceback (most recent call last):

  File "<ipython-input-7-7d712300046b>",line 1,in <module>
    make_Boxplots(success_list_data)

  File "<ipython-input-6-16ffa2fcfdd4>",line 37,in make_Boxplots
    setBoxColors(bp)

  File "<ipython-input-6-16ffa2fcfdd4>",line 18,in setBoxColors
    setp(bp['fliers'][3],color='green')

IndexError: list index out of range

解决方法

这是可以正常运行的代码。

from matplotlib.pyplot import (plot,savefig,xlim,figure,ylim,legend,boxplot,setp,axes,xlabel,ylabel,xticks,axvline)
# Need to import matplotlib.pyplot since you are using it below.
import matplotlib.pyplot as plt

success_list_data=[[1.,2.,3.,4.,5.],[1.,5.]]

# function for setting the colors of the box plots pairs
def setBoxColors(bp):
    setp(bp['boxes'][0],color='red')
    setp(bp['caps'][0],color='red')
    setp(bp['caps'][1],color='red')
    setp(bp['whiskers'][0],color='red')
    setp(bp['whiskers'][1],color='red')
    setp(bp['fliers'][0],color='red')
    setp(bp['fliers'][1],color='red')
    setp(bp['medians'][0],color='red')

    setp(bp['boxes'][1],color='green')
    setp(bp['caps'][2],color='green')
    setp(bp['caps'][3],color='green')
    setp(bp['whiskers'][2],color='green')
    setp(bp['whiskers'][3],color='green')
    setp(bp['fliers'][2],color='green')
    # setp(bp['fliers'][3],color='green')
    setp(bp['medians'][1],color='green')
    
    setp(bp['boxes'][2],color='purple')
    setp(bp['caps'][4],color='purple')
    setp(bp['caps'][5],color='purple')
    setp(bp['whiskers'][4],color='purple')
    setp(bp['whiskers'][5],color='purple')
    # setp(bp['fliers'][4],color='purple')
    # setp(bp['fliers'][5],color='purple')
    setp(bp['medians'][2],color='purple')


def make_boxplots(success_list_data):

    fig = figure()
    ax = axes()

    bp = boxplot(success_list_data,positions = [1,2,3],widths = 0.6)
    setBoxColors(bp)
    
        # label the x-ticks.
    plt.xticks([1,['Delta','Diag. Normal','Laplace'])
    
    # label for the x-axis.
    plt.xlabel('Guide Type')
    # label for the y-axis.
    plt.ylabel('Test Success Rate')


make_boxplots(success_list_data)

这是bp['fliers']的输出:

  [<matplotlib.lines.Line2D at 0x7fa8e0d41710>,<matplotlib.lines.Line2D at 0x7fa8e0d52a10>,<matplotlib.lines.Line2D at 0x7fa8e0d64cd0>]

3或更高的索引将超出索引范围。