2016-06-29 22 views
4

Problem: Wenn in Matplotlib Plotten Mehrere Histogramme, ich kann keine Handlung von einem anderen unterscheidenPlotten Mehrere Histogramme in Matplotlib - Farben oder Side-by-Side-Bars

Problem als Image: ** Problem ** Minor Problem: Die linke Bezeichnung 'Count' ist teilweise außerhalb des Bildes. Warum?

Beschreibung

ich das Histogramm der drei verschiedenen Sätzen darstellen möchten. Jeder Satz ist ein Array mit Nullen und Einsen. Ich möchte das Histogramm von jedem, so dass ich Ungleichgewichte auf dem Datensatz erkennen kann.

Ich habe sie separat gezeichnet, aber ich wollte eine Grafik von ihnen zusammen.

Es wäre okay, eine andere Grafik mit Balken nebeneinander zu haben, oder ich googelte sogar über das Plotten als 3D, aber ich weiß nicht, wie einfach es wäre, die Grafik zu "lesen" oder zu "sehen" und verstehe es.

Gerade jetzt, ich will den [Zug] plotten, [Validierung] und [Test] Bars an jeder Seite auf der gleiche Grafik, etwa wie folgt:

I want it like this

PS: Meine googeln gab keinen Code zurück, der für mich verständlich war. Auch würde ich gerne wenn jemand überprüfen würde, ob ich Wahnsinn auf meinem Code tun.

Vielen Dank Jungs!

Code:

def generate_histogram_from_array_of_labels(Y=[], labels=[], xLabel="Class/Label", yLabel="Count", title="Histogram of Trainset"): 
    plt.figure() 
    plt.clf() 

    colors = ["b", "r", "m", "w", "k", "g", "c", "y"] 

    information = [] 
    for index in xrange(0, len(Y)): 
     y = Y[index] 

     if index > len(colors): 
      color = colors[0] 
     else: 
      color = colors[index] 

     if labels is None: 
      label = "?" 
     else: 
      if index < len(labels): 
       label = labels[index] 
      else: 
       label = "?" 

     unique, counts = np.unique(y, return_counts=True) 
     unique_count = np.empty(shape=(unique.shape[0], 2), dtype=np.uint32) 

     for x in xrange(0, unique.shape[0]): 
      unique_count[x, 0] = unique[x] 
      unique_count[x, 1] = counts[x] 

     information.append(unique_count) 

     # the histogram of the data 
     n, bins, patches = plt.hist(y, unique.shape[0], normed=False, facecolor=color, alpha=0.75, range=[np.min(unique), np.max(unique) + 1], label=label) 

    xticks_pos = [0.5 * patch.get_width() + patch.get_xy()[0] for patch in patches] 

    plt.xticks(xticks_pos, unique) 

    plt.xlabel(xLabel) 
    plt.ylabel(yLabel) 
    plt.title(title) 
    plt.grid(True) 
    plt.legend() 
    # plt.show() 

    string_of_graphic_image = cStringIO.StringIO() 

    plt.savefig(string_of_graphic_image, format='png') 
    string_of_graphic_image.seek(0) 

    return base64.b64encode(string_of_graphic_image.read()), information 

bearbeiten

Im Anschluss an die Antwort von Hash-Code, dieser neue Code:

def generate_histogram_from_array_of_labels(Y=[], labels=[], xLabel="Class/Label", yLabel="Count", title="Histogram of Trainset"): 
    plt.figure() 
    plt.clf() 

    colors = ["b", "r", "m", "w", "k", "g", "c", "y"] 
    to_use_colors = [] 
    information = [] 


    for index in xrange(0, len(Y)): 
     y = Y[index] 

     if index > len(colors): 
      to_use_colors.append(colors[0]) 
     else: 
      to_use_colors.append(colors[index]) 

     unique, counts = np.unique(y, return_counts=True) 
     unique_count = np.empty(shape=(unique.shape[0], 2), dtype=np.uint32) 

     for x in xrange(0, unique.shape[0]): 
      unique_count[x, 0] = unique[x] 
      unique_count[x, 1] = counts[x] 

     information.append(unique_count) 

    unique, counts = np.unique(Y[0], return_counts=True) 
    histrange = [np.min(unique), np.max(unique) + 1] 
    # the histogram of the data 
    n, bins, patches = plt.hist(Y, 1000, normed=False, alpha=0.75, range=histrange, label=labels) 


    #xticks_pos = [0.5 * patch.get_width() + patch.get_xy()[0] for patch in patches] 

    #plt.xticks(xticks_pos, unique) 

    plt.xlabel(xLabel) 
    plt.ylabel(yLabel) 
    plt.title(title) 
    plt.grid(True) 
    plt.legend() 

produziert diese:

Result

- New Edit:

def generate_histogram_from_array_of_labels(Y=[], labels=[], xLabel="Class/Label", yLabel="Count", title="Histogram of Trainset"): 
    plt.figure() 
    plt.clf() 

    information = [] 

    for index in xrange(0, len(Y)): 
     y = Y[index] 

     unique, counts = np.unique(y, return_counts=True) 
     unique_count = np.empty(shape=(unique.shape[0], 2), dtype=np.uint32) 

     for x in xrange(0, unique.shape[0]): 
      unique_count[x, 0] = unique[x] 
      unique_count[x, 1] = counts[x] 

     information.append(unique_count) 

    n, bins, patches = plt.hist(Y, normed=False, alpha=0.75, label=labels) 

    plt.xticks((0.25, 0.75), (0, 1)) 

    plt.xlabel(xLabel) 
    plt.ylabel(yLabel) 
    plt.title(title) 
    plt.grid(True) 
    plt.legend() 

arbeitet jetzt aber, das Etikett von der linken Seite ist ein bisschen außerhalb der Grenzen und ich wollte besser die Bars zum Zentrum ... Wie kann ich das tun ?

Ergebnis: enter image description here

+0

Sie haben den Parameter 'bins' entfernt, standardmäßig ist er auf 10 gesetzt. Fügen Sie einfach einen bins param wie folgt hinzu:' n, bins, patches = plt.hist (Y, bins = 2, normiert = False, alpha = 0.75, range = histrange, label = labels) ' – hashcode55

+0

Haben Sie versucht, die Bins auf 2 zu setzen? – hashcode55

+0

Und in Bezug auf das Etikett nicht angezeigt wird, ich denke, es ist ein maschinenspezifisches Problem. Sie können versuchen, den Subplot anzupassen ... Überprüfen Sie dies http://matplotlib.org/examples/pylab_examples/subplots_adjust.html – hashcode55

Antwort

6

Ich habe versucht, und kam mit dieser. Sie können die xticks-Position im Code ändern. Einfach was du tun musst, ist ein Tupel an die plt.hist weiterzugeben, einfacher kann das nicht sein !?So können Sie haben zwei Listen von 0 und 1 annehmen, so was muss man tun, ist -

a = np.random.randint(2, size=1000) 
b = np.random.randint(2, size=1000) 
plt.hist((a, b), 2, label = ("data1", "data2")) 
plt.legend() 
plt.xticks((0.25, 0.75), (0, 1)) 

enter image description here

Der genaue Code, den ich versuchte zu laufen (nach der Anzahl der Bins auf 2 zu ändern) -

a = np.random.randint(2, size=1000) 
b = np.random.randint(2, size=1000) 
y = [a, b] 
labels = ["data1", "data2"] 
generate_histogram_from_array_of_labels(Y = y, labels = labels) 

Aand ich habe das gleiche Ergebnis ...

+0

Es scheint, dass es jetzt funktioniert hat! Kannst du mir jedoch helfen, diese kleinen Probleme zu beheben? Ich wollte die Bars besser auf den X-Labeln zentrieren! Auch das linke Label ist außerhalb der Grenzen! – KenobiShan

1

Wenn Ihre Datensätze gleich lang sind, können Sie in der Lage sein, dies mit Pandas leicht zu tun. Also vorausgesetzt, Sie haben

import numpy 

N = 1000 
train, validation, test = [numpy.random.randint(2, size=N) for _ in range(3)] 
Y = [train, validation, test] 

Sie einfach

tun können
import pandas 

df = pandas.DataFrame(list(zip(*Y)), columns=['Train', 'Validation', 'Test']) 
df.apply(pandas.value_counts).plot.bar() 

, die in dieser Handlung führt:

automatic count graph with pandas

Wenn Sie auch import seaborn, es sieht ein bisschen schöner:

automatic count graph with seaborn

+0

Ich muss das Bild speichern .. ist es möglich mit diesem Code, den Sie vorgestellt haben? – KenobiShan

+0

@ScientistGirl Ja, benutze Savefig wie immer. – chthonicdaemon