PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Python und MatPlotLib



maria_dolores
09-08-2010, 15:54
Hallo zusammen,

ich habe ein Problem mit der matplotlib und hoffe, ihr könnt mir helfen.
Ich habe eine Datenbank, mache eine Abfrage und möchte das Ergebnis dieser Abfrage als Balkendiagramm mit Hilfe von matplotlib ausgeben.

An sich ist ein solcher Plot (eine x-Achse und eine y-Achse) kein Problem. Ich möchte nun noch eine zweite y-Achse einfügen und auch weitere "Balken" einfügen, die sich auf die zweite y-Achse beziehen. Ich hoffe, dass das einigermaßen verständlich geschrieben ist. Im Internet habe ich auch schon was dazu gefunden (twinx), allerdings hat es bei mir bisher nicht funktioniert.

Mein bisheriger Code sieht so aus:



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

connection = sqlite3.connect("MeineDatenbank")
cursor = connection.cursor()
cursor.execute("Select * from MeineTabelle")
ThisTable = cursor.fetchall()
Datum = []
Zeit = []
Distanz = []
for entry in ThisTable:
Datum.append(entry[0])
Zeit.append(entry[1])
Distanz.append(entry[2])
print ThisTable

fig = plt.figure()
N = len(Datum)
ind = np.arange(N)
width = 0.35
ax1 = fig.add_subplot(111)
ax1.bar(ind, Zeit, width, color='grey')
ax1.set_ylabel('Zeit', color='b')
ax1.set_xlabel('YYYY/MM', color='black')
ax1.set_xticks(ind + width)
ax1.set_xticklabels(Datum)


ax2 = ax1.twinx()
M = max(Distanz)
ind2 = np.arange(M)
ax2.bar(ind, Distanz, width, color='red')
ax2.set_ylabel('Distanz', color='r')

plt.show()


Im Anhang ist ein Beispielplot, wie ich ihn am liebsten hätte. Allerdings erscheinen bei mir immer nur ein "paar" Balken. Nie die von beiden y-Achsen.

Habt ihr vielleicht eine Idee oder vielleicht sogar eine Lösung für mich?

Gruß
Isa

maria_dolores
10-08-2010, 08:10
Ich habe es nun soweit geschafft, dass die beiden Balken geplottet werden. Allerdings nur übereinander. Für alle, die es interessiert, hier mein Code:



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

connection = sqlite3.connect("MeineDatenbank.db")
cursor = connection.cursor()
cursor.execute("SELECT * FROM MeineTabelle")
ThisTable = cursor.fetchall()
Datum = []
Zeit = []
Distanz =[]
for entry in ThisTable:
Datum.append(runtime[0])
Zeit.append(runtime[1]/3600)
Distanz.append(runtime[2]/1000)
print ThisTable

fig = plt.figure()
ax1 = fig.add_subplot(111)
N = len(Datum)
ind = np.arange(N)
width = 0.35
ax1.bar(ind, Zeit, width, color='orange')
ax1.set_ylabel('Time', color='black')
ax1.set_xlabel('YYYY/MM', color='black')
ax1.set_xticks(ind + width)
ax1.set_xticklabels(Datum)

ax2 = ax1.twinx()
M = max(Distanz)
ind2 = np.arange(M)
ax2.set_xticklabels(Datum)

ax2.bar(ind, Distanz, width, color='black')
ax2.set_ylabel('Distanz', color='black')

plt.show()


Nun ist es noch nicht ganz perfekt. Ich möchte die Balken des Diagramms nicht übereinander, sondern nebeneinander haben.

Hat da jemand eine Idee?
Freue mich über jede Antwort.

Gruß
Isa

maria_dolores
10-08-2010, 12:26
Ok, ich habe es doch noch rausgefunden. Man muss jeweils z ax(2).bar(...) etwas dazuschreiben:



ax.bar(..., align='center')
::::
ax2.bar(..., align='edge')


Nun verschiebt sich allerdings die Skalierung der x-Achse. Weiss jemand, wie man das hinbiegen kann?

Irgendwie werde ich das Gefühl nicht los, dass dieses Thema hier in diesem Forum falsch ist.

Gruß Isa

maria_dolores
10-08-2010, 15:24
Also hier nochmal beide Screenshots, damit ihr vielleicht besser versteht was ich meine. Man achte besonders auf die x-Achse.

Gruß Isa

undefined
10-08-2010, 17:13
Ich tippe mal auf Leere Werte in der for Schleife.
Eine if Abfrage könnte helfen.

maria_dolores
11-08-2010, 08:48
Ah ok. Kann man mit einer (oder mehreren) Schleife(n) auch das hier mit bar bewältigen?

Gruß Isa