2017-11-14 4 views
-1

Ich habe ein Matplotlib-Diagramm, für das die x-Daten ein Pandas DateTimeIndex ist.Matplotlib: Zeitachsen und Grenzen

Der Benutzer kann die X-Achse mit dem Scrollrad zoomen. Die Grenzen werden wie folgt neu berechnet:

limits = ax.get_xlim() 
span = limits[1] - limits[0] 
pos = (1 - (limits[1] - evt.xdata)/span) 
if evt.button == 'up': 
    limits = (limits[0] + span/1.3/2 * pos, 
       limits[1] - span/1.3/2 * (1 - pos)) 
elif evt.button == 'down': 
    limits = (limits[0] - span/1.3/2 * pos, 
       limits[1] + span/1.3/2 * (1 - pos)) 

Dies funktioniert und zoomt die x-Achse in oder auf dem Punkt, wo das Scroll-Ereignis passiert ist. Jetzt versuche ich, die y-Achse Grenzen neu zu berechnen, angezeigt auf die Daten zu vergrößern, kann aber nicht herausfinden, wie die x-Achsen-Daten und die x-Grenzen miteinander in Beziehung stehen:

lines = ax.get_lines() 
y_lim = np.inf, -np.inf 
for line in lines: 
    xd = line.get_xdata() 
    yd = line.get_ydata() 
    y_displayed = yd[((xd > limits[0]) & (xd < limits[1]))] 
    y_lim = min(np.min(y_displayed), y_lim[0]), max(np.max(y_displayed), y_lim[1]) 
ax.set_ylim(y_lim) 

Dies scheitert mit die Nachricht TypeError: Invalid type promotion.

Soweit ich erkennen kann, wird die x-Daten als numpy.datetime64 gespeichert werden, sondern matplotlib kehrt die Grenzen als Schwimmer, die die Anzahl der Tage seit 0001-01-01 00:00 plus 1. repräsentiert Wie bekomme ich diese in irgendeiner Form kann ich Vergleichen Sie mit einem Array von datetime64?

Antwort

1

Nevermind, sobald ich die Frage gepostet ich es herausgefunden:

from matplotlib.dates import num2date 

limits = (np.datetime64(num2date(limits[0])), np.datetime64(num2date(limits[1]))) 
+0

Glauben Sie, das in irgendeiner Weise für jedermann außer sich selbst nützlich ist? Die Frage ist noch nicht vollständig und es ist völlig unklar, warum diese Codezeile das Problem löst (nur für den Fall, dass jemand das Problem tatsächlich versteht). – ImportanceOfBeingErnest

+1

Nun, es dauerte eine sehr verwirrte Stunde oder so, um herauszufinden, die verschiedenen Datumsformate beteiligt und wenn jemand anderes versuchen wird, die Grenzen der Matplotlib Zeitachsen zu manipulieren, dann ja, ich denke, es wäre hilfreich, dies zu finden. – Tom

+0

Ist die Frage, wie man die Grenzen der Achsen einstellt? Ich würde vermuten, dass dies bereits [https://stackoverflow.com/a/29614350/4124317] ausreichend beantwortet ist, aber wenn Sie denken, dass es nicht ist, wäre es viel nützlicher, eine Antwort zu dieser Frage hinzuzufügen anstatt dieser hier, der wirklich schwer zu verstehen ist. – ImportanceOfBeingErnest

Verwandte Themen