Samstag, Januar 18, 2020

Wie center-Etiketten im Histogramm-plot

Habe ich ein numpy-array results, das aussieht wie

[ 0.  2.  0.  0.  0.  0.  3.  0.  0.  0.  0.  0.  0.  0.  0.  2.  0.  0.
  0.  0.  0.  1.  0.  0.  0.  0.  0.  0.  0.  1.  0.  0.  0.  0.  0.  0.
  0.  1.  1.  0.  0.  0.  0.  2.  0.  3.  1.  0.  0.  2.  2.  0.  0.  0.
  0.  0.  0.  0.  0.  1.  1.  0.  0.  0.  0.  0.  0.  2.  0.  0.  0.  0.
  0.  1.  0.  0.  0.  0.  0.  0.  0.  0.  0.  3.  1.  0.  0.  0.  0.  0.
  0.  0.  0.  1.  0.  0.  0.  1.  2.  2.]

Ich möchte plot eines Histogramms der es. Ich habe versucht

import matplotlib.pyplot as plt
plt.hist(results, bins=range(5))
plt.show()

Gibt mir ein Histogramm mit der x-Achse gekennzeichnet 0.0 0.5 1.0 1.5 2.0 2.5 3.0. 3.5 4.0.

Ich möchte die x-Achse beschriftet werden soll 0 1 2 3 statt mit den labels in der Mitte der einzelnen Balken. Wie Sie das tun können?

  • Im nicht sicher, was Sie wollen. Wollen Sie den Behälter zentriert um 1,2,3 (so um die integer statt der 1.5, 2.5-Werte). Oder wollen Sie für die Beschriftung der Balken mit text oder so? Denn wenn, führe ich Ihren Befehl, meine Ausgabe ist (array([ 4., 5., 1., 2.]), array([0, 1, 2, 3, 4]) (mit unterschiedlichen Eingabewerten). Also hab ich mir verschiedene Behälter, oder vermisse ich etwas?
  • Der erste Balken ist die Anzahl der 0EN in results, die zweite die zahlen von 1s (gibt es elf davon), der Dritte die Anzahl der 2s (es gibt acht) und die Letzte ist die Anzahl der 3s – (es gibt drei davon). Ich möchte die Anzahl 0 als ein label, unter der Mitte der ersten bar, die Nummer 1 als ein label, unter der Mitte des zweiten und so weiter. Ist das klarer?
  • So gibt es keine Probleme mit der Gruppierung, die Sie gerade hinzufügen möchten Etiketten auf die Behälter?
  • Ja, ich möchte, um loszuwerden, der Standard-Etiketten und fügen Sie die, die ich beschrieben.
InformationsquelleAutor eleanora | 2014-04-23

3 Kommentare

  1. 6

    Folgende alternative Lösung ist kompatibel mit plt.hist() (und das hat den Vorteil, zum Beispiel, dass man das so nennen kann nach einer pandas.DataFrame.hist().

    import numpy as np
    
    def bins_labels(bins, **kwargs):
        bin_w = (max(bins) - min(bins)) / (len(bins) - 1)
        plt.xticks(np.arange(min(bins)+bin_w/2, max(bins), bin_w), bins, **kwargs)
        plt.xlim(bins[0], bins[-1])

    (Die Letzte Zeile ist nicht ausdrücklich angeforderter durch die OP, aber es macht die Ausgabe schöner)

    Diese können verwendet werden, wie in:

    import matplotlib.pyplot as plt
    bins = range(5)
    plt.hist(results, bins=bins)
    bins_labels(bins, fontsize=20)
    plt.show()

    Wie center-Etiketten im Histogramm-plot

    • Können Sie erklären, warum Sie nur die bins 0,1,2,3, aber verwenden Sie range(5) ?
    • sicher. Bin 0-Abdeckungen von 0 auf 1 in die Handlung, bin 1 erstreckt sich von 1 zu 2… und so weiter, bis bin 3, die deckt von 3-4 in die Handlung. Also die Ablagen (Links und rechts), Grenzen muss die Reihenfolge [0, 1, 2, 3, 4]… und genau das ist range(5). Seltsam, ich weiß, aber die einzige alternative, die ich sehe (Zentrierung bin ich von der i-1/2 i+1/2) wäre komplizierter.
    • Diese Antwort ist effizient in einem allgemeineren Fall, wenn Behälter neu definiert werden, z.B. als bins = np.arange(2, 7, .5)
  2. 10

    Die anderen Antworten einfach nicht tun es für mich. Der Vorteil der Verwendung von plt.bar über plt.hist ist, dass bar können align='center':

    import numpy as np
    import matplotlib.pyplot as plt
    
    arr = np.array([ 0.,  2.,  0.,  0.,  0.,  0.,  3.,  0.,  0.,  0.,  0.,  0.,  0.,
            0.,  0.,  2.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,
            0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  1.,
            0.,  0.,  0.,  0.,  2.,  0.,  3.,  1.,  0.,  0.,  2.,  2.,  0.,
            0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  1.,  0.,  0.,  0.,  0.,
            0.,  0.,  2.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,
            0.,  0.,  0.,  0.,  0.,  3.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,
            0.,  0.,  1.,  0.,  0.,  0.,  1.,  2.,  2.])
    
    labels, counts = np.unique(arr, return_counts=True)
    plt.bar(labels, counts, align='center')
    plt.gca().set_xticks(labels)
    plt.show()

    Wie center-Etiketten im Histogramm-plot

    • Wie hat sich niemand gratuliert Ihnen auf diesem? Definitiv die eleganteste und einfachste Lösung, um genau dieses problem. Dies sollte berücksichtigt werden, die beste Lösung für die Visualisierung einer diskreten Verteilung.
  3. 5

    können Sie bauen eine bar plot aus einem np.histogram.

    Betrachten Sie diese

    his = np.histogram(a,bins=range(5))
    fig, ax = plt.subplots()
    offset = .4
    plt.bar(his[1][1:],his[0])
    ax.set_xticks(his[1][1:] + offset)
    ax.set_xticklabels( ('1', '2', '3', '4') )

    Wie center-Etiketten im Histogramm-plot

    EDIT:, um die bars einander berühren, hat man das Spiel mit dem parameter „Breite“.

     fig, ax = plt.subplots()
     offset = .5
     plt.bar(his[1][1:],his[0],width=1)
     ax.set_xticks(his[1][1:] + offset)
     ax.set_xticklabels( ('1', '2', '3', '4') )

    Wie center-Etiketten im Histogramm-plot

    • Danke! Wie wollen Sie loswerden der Räume zwischen den Balken?
    • Ahh vielen Dank. Ich war auch arbeiten auf so etwas wie dieses, nur nicht die xticks arbeiten. Vielen Dank für die Klarstellung
    • bars wurden behoben.
    • Auch, wie erstelle ich (‚0‘, ‚1‘, ‚2‘,’3′) wenn ich wollte, um zu gehen von 0 auf 100 sagen? Tupel(str(i) for i in range(101)) ?
    • Das funktioniert, aber ich würde np.arange(1, 101).astype(str) oder ohne numpy: map(str, range(1, 101))

Kostenlose Online-Tests