it-swarm.com.de

Python Matplotlib mehrere Bars

Wie man mehrere Balken in matplotlib plottet, wenn ich versucht habe, die Balkenfunktion mehrmals aufzurufen, überlappen sie sich und wie unten gezeigt, ist der höchste Wert rot nur zu sehen x-Achsen 

Bisher habe ich es versucht:

import matplotlib.pyplot as plt
  import datetime

    x = [datetime.datetime(2011, 1, 4, 0, 0),
         datetime.datetime(2011, 1, 5, 0, 0),
         datetime.datetime(2011, 1, 6, 0, 0)]
    y = [4, 9, 2]
    z=[1,2,3]
    k=[11,12,13]

    ax = plt.subplot(111)
    ax.bar(x, y,width=0.5,color='b',align='center')
    ax.bar(x, z,width=0.5,color='g',align='center')
    ax.bar(x, k,width=0.5,color='r',align='center')
    ax.xaxis_date()

    plt.show()

Ich habe das bekommen: 

enter image description here

Die Ergebnisse sollten ungefähr so ​​aussehen, aber mit den Datumsangaben sind die x-Achsen und die Balken nebeneinander: 

enter image description here

41
John Smith
import matplotlib.pyplot as plt
from matplotlib.dates import date2num
import datetime

x = [datetime.datetime(2011, 1, 4, 0, 0),
     datetime.datetime(2011, 1, 5, 0, 0),
     datetime.datetime(2011, 1, 6, 0, 0)]
x = date2num(x)

y = [4, 9, 2]
z=[1,2,3]
k=[11,12,13]

ax = plt.subplot(111)
ax.bar(x-0.2, y,width=0.2,color='b',align='center')
ax.bar(x, z,width=0.2,color='g',align='center')
ax.bar(x+0.2, k,width=0.2,color='r',align='center')
ax.xaxis_date()

plt.show()

enter image description here

Ich weiß nicht, was die "y-Werte überlappen" bedeutet, löst der folgende Code Ihr Problem?

ax = plt.subplot(111)
w = 0.3
ax.bar(x-w, y,width=w,color='b',align='center')
ax.bar(x, z,width=w,color='g',align='center')
ax.bar(x+w, k,width=w,color='r',align='center')
ax.xaxis_date()
ax.autoscale(tight=True)

plt.show()

enter image description here

66
HYRY

Das Problem bei der Verwendung von Datumsangaben als x-Werte ist, dass, wenn Sie ein Balkendiagramm wie in Ihrem zweiten Bild wünschen, diese falsch sein werden. Sie sollten entweder ein gestapeltes Balkendiagramm (Farben übereinander) verwenden oder nach Datum gruppieren (ein "falsches" Datum auf der X-Achse, im Wesentlichen nur die Datenpunkte gruppieren).

import numpy as np
import matplotlib.pyplot as plt

N = 3
ind = np.arange(N)  # the x locations for the groups
width = 0.27       # the width of the bars

fig = plt.figure()
ax = fig.add_subplot(111)

yvals = [4, 9, 2]
rects1 = ax.bar(ind, yvals, width, color='r')
zvals = [1,2,3]
rects2 = ax.bar(ind+width, zvals, width, color='g')
kvals = [11,12,13]
rects3 = ax.bar(ind+width*2, kvals, width, color='b')

ax.set_ylabel('Scores')
ax.set_xticks(ind+width)
ax.set_xticklabels( ('2011-Jan-4', '2011-Jan-5', '2011-Jan-6') )
ax.legend( (rects1[0], rects2[0], rects3[0]), ('y', 'z', 'k') )

def autolabel(rects):
    for rect in rects:
        h = rect.get_height()
        ax.text(rect.get_x()+rect.get_width()/2., 1.05*h, '%d'%int(h),
                ha='center', va='bottom')

autolabel(rects1)
autolabel(rects2)
autolabel(rects3)

plt.show()

enter image description here

28
jozzas

Ich weiß, dass es um matplotlib geht, aber die Verwendung von pandas und seaborn kann Ihnen viel Zeit sparen:

df = pd.DataFrame(Zip(x*3, ["y"]*3+["z"]*3+["k"]*3, y+z+k), columns=["time", "kind", "data"])
plt.figure(figsize=(10, 6))
sns.barplot(x="time", hue="kind", y="data", data=df)
plt.show()

 enter image description here 

3
liwt31

Ich habe diese Lösung gemacht: Wenn Sie mehrere Diagramme in einer Figur plotten möchten, stellen Sie sicher, dass Sie vor dem Plotten der nächsten Diagramme matplotlib.pyplot.hold(True) gesetzt haben, um weitere Diagramme hinzuzufügen.

Über datetime-Werte auf X-Achse funktioniert die Lösung mit der Ausrichtung von Balken für mich. Wenn Sie mit matplotlib.pyplot.bar() ein weiteres Balkendiagramm erstellen, verwenden Sie einfach align='Edge|center' und legen Sie width='+|-distance' fest.

Wenn Sie alle Balken (Plots) richtig einstellen, werden Balken gut angezeigt.

0
Dave