2017-12-21 28 views
1

Ich möchte manuell einen Rand zu den Boxplots hinzufügen, die durch den folgenden Code generiert werden. Derzeit sind die Boxplots zu sehr in den Ecken (Enden). Im Allgemeinen wird es viele Boxplots geben (im Gegensatz zu diesem Beispielcode), die ich in gleichem Abstand (wie im Code) haben möchte, aber ich möchte einen Rand auf den Seiten haben.Rand Boxplots Matplotlib

I matplotlib Version 1.3.1

enter image description here

import matplotlib.pyplot as plt 
statistic_dict = {0.40000000000000002: [0.36003616645322273, 0.40526649416305677, 0.46522159350924536], 0.20000000000000001: [0.11932912803730165, 0.23235825966896217, 0.12380728472472625]} 
def draw_boxplot(y_values, x_values, edge_color, fill_color): 
    bp = plt.boxplot(y_values, patch_artist=True, positions=x_values, widths=(0.05,0.05)) 
    for element in ['boxes', 'whiskers', 'fliers', 'medians', 'caps']: 
     plt.setp(bp[element], color=edge_color) 
    plt.xlabel("x label ") 
    plt.ylabel("y label ") 
    plt.title("Title") 
    for patch in bp['boxes']: 
     patch.set(facecolor=fill_color) 
y_values = statistic_dict.values() 
x_values = statistic_dict.keys() 
draw_boxplot(y_values, x_values, "skyblue", "white") 
plt.gca().autoscale() 
plt.savefig('fileName.png', bbox_inches='tight') 
plt.close() 
+0

Matplotlib 1.3.1 ist mehr als 4 Jahre alt. Darf ich ein Upgrade empfehlen, so dass die Lösung [hier] (https://stackoverflow.com/a/47926303/4124317) gut funktioniert. – ImportanceOfBeingErnest

+0

Ich habe einige Probleme mit der Aktualisierung .... – user58925

Antwort

1

Die folgenden verwenden eine Hacky Abhilfe bei ax.margins() wird nicht wie erwartet funktioniert.

import numpy as np 
import matplotlib.pyplot as plt 

statistic_dict = {0.40: [0.36, 0.40, 0.46], 
        0.20: [0.11, 0.23, 0.12], 
        0.70: [0.19, 0.23, 0.12]} 

def draw_boxplot(y_values, x_values, edge_color, fill_color): 
    bp = plt.boxplot(y_values, patch_artist=True, positions=x_values) 
    for element in ['boxes', 'whiskers', 'fliers', 'medians', 'caps']: 
     plt.setp(bp[element], color=edge_color) 
    plt.xlabel("x label ") 
    plt.ylabel("y label ") 
    plt.title("Title") 
    for patch in bp['boxes']: 
     patch.set(facecolor=fill_color) 

    v = np.array([box.get_path().vertices for box in bp['boxes']]) 
    margin=0.2 
    xmin = v[:,:5,0].min() - (max(x_values)-min(x_values))*margin 
    xmax = v[:,:5,0].max() + (max(x_values)-min(x_values))*margin 
    plt.xlim(xmin, xmax) 

y_values = statistic_dict.values() 
x_values = statistic_dict.keys() 
draw_boxplot(y_values, x_values, "skyblue", "white") 

plt.show()