2016-04-29 12 views
0

Ich versuche, Daten auf der x-Achse zu plotten und ich verstehe nicht wirklich die Beziehung zwischen Marge, Breite der Balken. Ich möchte Balken haben, die nahe beieinander liegen und durch eine kleine Lücke zwischen jedem einzelnen Datum (Balken) getrennt sind. Jedes Mal, wenn ich mein Diagramm zeichne, merke ich, dass ich andere Daten bekomme, die in meinem Code nicht festgelegt sind. Wie kann ich meinen Code aufräumen, damit die Balken in einem angemessenen Abstand zueinander liegen und die Daten entfernt werden, die keine Daten enthalten?Entfernen Sie redundanten Abstand zwischen Unterplots mit Matplotlib

import numpy as np 
import matplotlib.pyplot as plt 
import datetime 

x = [datetime.datetime(2010, 12, 1, 10, 0), 
datetime.datetime(2010, 12, 1, 10, 0), 
datetime.datetime(2011, 1, 4, 9, 0), 
datetime.datetime(2011, 5, 5, 9, 0)] 

y = [5,4, 9, 2] 

ax = plt.subplot(111) 
colors = ['r','g','b','y'] 
ax.bar(x, y, width=10,align='center',color=colors,edgecolor = "none") 
ax.xaxis_date() 

plt.show() 

Das Ergebnis, das ich bekommen ist:
enter image description here

Antwort

0

Der Grund, dass, wenn Sie auf die .bar() Funktion in matplotlib passieren, x nicht die Achsenbeschriftungen, sondern vielmehr der Bereich der Werte. Daher versucht matplotlib automatisch, den Bereich der x-Achse maßstäblich zu skalieren. Wenn Sie stattdessen nur wollen, um Ihre Termine anzuzeigen, wollen Sie so etwas wie dies zu tun:

dummy_x = range(len(x)) 
ax.bar(dummy_x, y, width=10,align='center',color=colors,edgecolor = "none") 
ax.set_xticklabels(x) 

Um die Formatierung direkt auf den Etiketten erhalten Sie möglicherweise einige zusätzliche Formatierung tun wollen, so etwas wie:

ax.set_xticklabels([dt.strftime("%b %Y") for dt in x]) 

Seien Sie sich bewusst, dass dies auf Ihrem Diagramm bedeutet, dass die X-Achsen-Ticks nicht mehr die gleichen Abstände zwischen den Balken darstellen - alles hängt davon ab, was Sie zeigen möchten, aber es könnte verwirrend sein.

0

Sie können eine x erstellen, die Sie wollen, und dann die Etiketten passieren mit tick_label:

import matplotlib.pyplot as plt 

x = [0, 0, 2, 1] 
y = [5,4, 9, 2] 

labels = ['Dec 2010', 'Dec 2010', 'Jan 2011', 'May 2011'] 

ax = plt.subplot(111) 
colors = ['r','g','b','y'] 
ax.bar(x, y,align='center',color=colors,edgecolor = "none", 
    tick_label=labels) 

plt.show() 
Verwandte Themen