2016-07-08 8 views
2

Ich versuche, ein Balkendiagramm mit Matplotlib für Python zu machen. Ich kann ein normales Diagramm erstellen, aber wenn ich es in den logarithmischen Modus setze, damit ich die Daten besser sehen kann, sieht die x-Achse so aus, als würde sie komprimieren. Was ist los? Hinweis: alle Datensätze haben einen Mindestwert von 1.Warum ist meine Matplotlib Balkendiagramm Komprimierung der X-Achse, wenn ich 'log'

x = [t[0] for t in data] 
    y = [t[1] for t in data] 

    x_pos = np.arange(len(x)) 

    plt.bar(x_pos, y, color='blue', log=False) 
    plt.xlabel(x_label) 
    plt.ylabel(y_label) 
    plt.title(title) 
    plt.xlim([0, len(x)]) 
    #plt.yscale('log') 
    #plt.semilogy(x_pos, np.exp(-x_pos/5.0)) 
    plt.savefig(output_path + '/' + filename) 

Ausbeuten: enter image description here

Aber gerade durch log=False zu log=True Wechsel erhalte ich: enter image description here

Was mache ich falsch? Ich möchte nur eine komprimierte Ansicht des ersten Graphen auf der y-Achse erhalten. Wie Sie sehen können, habe ich auch versucht yscale('log'), aber ich bekomme das gleiche Ergebnis.

Danke!

EDIT: Sieht aus wie es etwas mit den vorherigen Zeilen zu tun hat, als ich die erste Zeile entfernen es funktioniert gut, ist aber unsortiert:

data = sorted(data, key=lambda tup: tup[1], reverse=True) 

    # tuples (pair,count) 
    x = [t[0] for t in data] 
    y = [t[1] for t in data] 

Antwort

1

Es komprimiert deine X-Achse nicht; Der Mindestwert der y-Achse Ihres zweiten Plots ist 1 (10^0), was die Höhe des kleinsten Satzes von Strichen darstellt. Daher sind die äußersten rechten Balken außerhalb der y Skala auf Ihrem Semilog Plot.

Versuchen Sie, z.,

plt.ylim([0.1, 100]) 

die Sichtbarkeit der am weitesten rechts liegenden Stäbe zu erzwingen. (Eine logarithmisch skalierte Achse kann aus naheliegenden Gründen keine Mindestgrenze von 0 haben.)

+0

Danke, mein Herr! Das war in der Tat das Problem! – skaz

3

Wenn Sie nur ein Log-Skala auf der y-Achse wollen und nicht die x Verwendung:

import matplotlib.pyplot as plt 

plt.semilogy(x,y) #plots log on y axis 

plt.semilogx(x,y) #plots log on x axis 

Alternativ können Sie auch nur die Achse auf log:

ax = plt.subplot(224) 

ax.set_xscale("log") 
ax.set_yscale("log") 

plt.bar(x,y) 
+0

Ich habe das gleiche Problem. Es wird immer noch auf der X-Achse komprimiert, genau wie in meinem Beispiel. – skaz

+0

Ich habe beide Methoden ausprobiert, aber ich bekomme das gleiche Ergebnis. Die X-Achse ist komprimiert, wie in meinem zweiten Bild. – skaz

Verwandte Themen