Matplotlib boxplot using precalculated (summary) statistics

前端 未结 3 1011
抹茶落季
抹茶落季 2020-12-14 10:13

I need to do a boxplot (in Python and matplotlib) but I do not have the original \"raw\" data. What I have are precalculated values for max, min, mean, median and IQR (norma

相关标签:
3条回答
  • 2020-12-14 10:28

    Thanks to the comment of @tacaswell I was able to find the required documentation and come up with an example using Matplotlib 1.4.3. However, this example does not automatically scale the figure to the correct size.

    import matplotlib.pyplot as plt
    
    item = {}
    
    item["label"] = 'box' # not required
    item["mean"] = 5 # not required
    item["med"] = 5.5
    item["q1"] = 3.5
    item["q3"] = 7.5
    #item["cilo"] = 5.3 # not required
    #item["cihi"] = 5.7 # not required
    item["whislo"] = 2.0 # required
    item["whishi"] = 8.0 # required
    item["fliers"] = [] # required if showfliers=True
    
    stats = [item]
    
    fig, axes = plt.subplots(1, 1)
    axes.bxp(stats)
    axes.set_title('Default')
    y_axis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    y_values = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
    plt.yticks(y_axis, y_values)
    

    Relevant links to the documentation:

    • Axes.bxp() function
    • boxplot_stats datastructure
    • other examples using Axes.bxp
    0 讨论(0)
  • 2020-12-14 10:36

    Referring to the answer of @MKroehnert and Boxplot drawer function at https://matplotlib.org/gallery/statistics/bxp.html, the following could be helpful:

    import matplotlib.pyplot as plt
    
    stats = [{
        "label": 'A',  # not required
        "mean":  5,  # not required
        "med": 5.5,
        "q1": 3.5,
        "q3": 7.5,
        # "cilo": 5.3 # not required
        # "cihi": 5.7 # not required
        "whislo": 2.0,  # required
        "whishi": 8.0,  # required
        "fliers": []  # required if showfliers=True
        }]
    
    fs = 10  # fontsize
    
    fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(6, 6), sharey=True)
    axes.bxp(stats)
    axes.set_title('Boxplot for precalculated statistics', fontsize=fs)
    plt.show()
    
    0 讨论(0)
  • 2020-12-14 10:40

    In the old versions, you have to manually do it by changing boxplot elements individually:

    Mean=[3.4] #mean
    IQR=[3.0,3.9] #inter quantile range
    CL=[2.0,5.0] #confidence limit
    A=np.random.random(50)
    D=plt.boxplot(A) # a simple case with just one variable to boxplot
    D['medians'][0].set_ydata(Mean)
    D['boxes'][0]._xy[[0,1,4], 1]=IQR[0]
    D['boxes'][0]._xy[[2,3],1]=IQR[1]
    D['whiskers'][0].set_ydata(np.array([IQR[0], CL[0]]))
    D['whiskers'][1].set_ydata(np.array([IQR[1], CL[1]]))
    D['caps'][0].set_ydata(np.array([CL[0], CL[0]]))
    D['caps'][1].set_ydata(np.array([CL[1], CL[1]]))
    _=plt.ylim(np.array(CL)+[-0.1*np.ptp(CL), 0.1*np.ptp(CL)]) #reset the limit
    

    enter image description here

    0 讨论(0)
提交回复
热议问题