2017-12-12 2 views
0

Ich möchte ein Grundstück schaffen, wo die x-Zecken, wie die folgendenDie Kombination von zwei Variablen benutzerdefinierte x-Zecken zu schaffen, in Python matplotlib

2004 01 03  2004 01 10  2004 01 17   ... 
Square is 4.0 Square is 81.0 Square is 256.0 ... 

Die Termine in einem numpy Array von Datetime-Objekte gespeichert sind aussehen sollte und Die sekundären Werte (in diesem Fall [0, 1, 4, ...]) werden in einem num- py-Array derselben Größe gespeichert. Mein Code ist unten -

import datetime as dt 
import numpy as np 
import matplotlib.dates as mdt 
import matplotlib.pyplot as plt 

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

time = np.zeros(30, dtype=object) 
data1 = np.zeros(30) 
data2 = np.zeros(30) 

for i in range(30): 
    time[i] = dt.datetime(2004,1,1,0,0,0) \ 
       + dt.timedelta(days=1)*i 
    data1[i] = i 
    data2[i] = 2*i 

ax.plot(time, data1) 

Mtick = mdt.DayLocator(bymonthday=None, interval=7) 
mtick = mdt.DayLocator(bymonthday=range(1,32)) 
fmt = mdt.DateFormatter('%Y %m %d') 
ax.xaxis.set_major_locator(Mtick) 
ax.xaxis.set_minor_locator(mtick) 
ax.xaxis.set_major_formatter(fmt) 

plt.show() 

Wie kann ich anpassen/Format die Zecken die sekundären Werte aus dem data2 Variable enthalten?

Bearbeiten: Die Tick-Werte sollten den gleichen Index für beide time und data2 Variablen haben. Auch in diesem Beispiel ist die time Variable gleichmäßig verteilt, aber in meinen realen Daten ist dies nicht der Fall.

Antwort

0

Dies sollte man das gewünschte Ergebnis:

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

fig = plt.figure(1).clf() 
ax = plt.subplot(111) 

data1 = np.arange(30) 
time = dt.datetime(2004,1,1,0,0,0) + dt.timedelta(days=1)*data1 
data2 = data1*data1 

ax.plot(time, data1) 
major = slice(2,None,7) 
ax.set_xticks(time, minor=True) 
ax.set_xticks(time[major]) 
ax.set_xticklabels([t.strftime('%Y %m %d') + '\nSquare is ' + str(d2) for (t,d2) in zip(time,data2)][major]) 
+0

Dies ist nützlich, aber leider ist meine realen Daten nicht gleichmäßig in zeitlichem Abstand, so mit Scheibe ein wenig ungenau ist, wie ich die nicht a priori wissen Indizes werden zu welcher Zeit zugeordnet. –

+0

Ihr Problem ist nicht gut definiert, da Sie nicht garantieren können, dass die Tick-Position einem vorhandenen Datenpunkt entspricht. Sie können also einen 'square = data2'-Wert hinzufügen ... – Julien

+0

Fairerweise musste ich klarer sein. Es ist garantiert, dass jeder "Zeit" -Wert einen abbildbaren "Daten2" -Wert hat. In meinem eigentlichen Code ist 'data2' eine Funktion von' time'. Wenn also ein Zeit-Tick am 2004/01/03 ist, und wenn ich auf den Wert zugreifen kann, der diesem Tick entspricht, kann ich ihn an eine Funktion übergeben, um den entsprechenden 'data2'-Wert zu erhalten. –