2017-03-10 3 views
0

Ich habe einen Code, der eine benutzerdefinierte Balkendiagramm Plots:Nullwerte in barchart - Matplotlib

def bar_chartQ2(sizes, colors, x_labels, c_labels, file_name): 
    y, x = sizes.shape 
    ind = np.arange(y)*8 
    width = 0.7 

    plt.figure() 
    for i in range(x): 
     plt.bar(ind + width*i, sizes[:, i], width, color=colors[i], label=c_labels[i]) 

c_labels = ['1', '2', '3', '4', '5', '6', '7', '8', 'Unknown'] 
x_labels = ['1)', '2)', '3)', '4)', '5)'] 
sizes = np.array([[2, 8, 2, 1, 0, 0, 0, 0, 1], 
        [2, 4, 6, 0, 0, 0, 1, 0, 1], 
        [2, 0, 0, 2, 5, 0, 0, 1, 3], 
        [1, 0, 0, 3, 2, 2, 4, 0, 2], 
        [1, 0, 1, 0, 1, 1, 4, 3, 2]]) 
colors = ['royalblue', 'red', 'orange', 'green', 'purple', 'deepskyblue', 'deeppink', 'limegreen', 'firebrick'] 

bar_chartQ2(sizes, colors, x_labels, c_labels, 'Q2') 
    plt.legend(loc=(1.2, 0.2), shadow=True) 
    plt.xticks(ind + x/2.0*width, x_labels) 

    plt.tight_layout() 
    plt.savefig(file_name+'.pdf', format='pdf', bbox_inches='tight') 

Bisher das ist das Ergebnis:

enter image description here

Ich denke, es ist irgendwie unlesbar.

Ich möchte Bars mit size == 0 überspringen, d. H. Leere Leerzeichen zwischen Balken des gleichen Elements verhindert.

+0

Nur eine Anmerkung aber: was ist mit Menschen, die farbenblind sind? In diesem Fall kann die Position ihnen helfen, das Ergebnis zu verstehen. –

+0

Ja, du hast Recht, @ WillemVanOnsem. Aber wie ist es jetzt, denken Sie nicht daran, die Cluster zu identifizieren? Ich meine, es gab 5 Fragen mit jeweils 8 Optionen. Ohne die Farben kann ich nicht identifizieren, welche Balken jeder Frage entsprechen. Vielleicht wäre ein Muster statt Farbe besser. Oder ein anderer Ansatz. – pceccon

+0

Ich empfehle, dass Sie jeden Cluster auf seinen eigenen Achsen plotten und dann die Position jedes Balkens beschriften. –

Antwort

1

Hier ist eine Lösung, die alle Ihre Daten auf separaten Achsen Plots:

import numpy 
from matplotlib import pyplot 
import seaborn 

c_labels = ['1', '2', '3', '4', '5', '6', '7', '8', 'Unknown'] 
colors = ['royalblue', 'red', 'orange', 'green', 'purple', 'deepskyblue', 'deeppink', 'limegreen', 'firebrick'] 
x_labels = ['1)', '2)', '3)', '4)', '5)'] 
sizes = numpy.array([ 
    [2, 8, 2, 1, 0, 0, 0, 0, 1], 
    [2, 4, 6, 0, 0, 0, 1, 0, 1], 
    [2, 0, 0, 2, 5, 0, 0, 1, 3], 
    [1, 0, 0, 3, 2, 2, 4, 0, 2], 
    [1, 0, 1, 0, 1, 1, 4, 3, 2] 
]) 

fig, axes = pyplot.subplots(ncols=sizes.shape[0], figsize=(10, 5), sharey=True) 
for ax, height, title in zip(axes, sizes, x_labels): 
    ax.set_title(title) 

    left = numpy.arange(len(height)) + 1 
    ax.bar(left, height, color=colors) 

    ax.set_xticks(left) 
    ax.set_xticklabels(c_labels, rotation=45, rotation_mode='anchor', ha='right') 

enter image description here

+0

Perfekt, danke. – pceccon

+0

Wie bekomme ich die Legende zu zeigen? Ich probierte 'handles, labels = axes [0] .get_legend_handles_labels()' gefolgt von 'plt.legend (handles, labels)' (außerhalb der Schleife) aber es erscheint gar nicht .... – pceccon

+0

Auch wenn Ich speichere dieses Diagramm mit 'plt.tight_layout()' und 'plt.savegig (Dateiname + '. Pdf', Format = 'pdf', bbox_inches = 'eng')' alle Texte verschwinden. Das passiert gerade mit diesem 'Seaborn'-Paket. – pceccon