2017-02-13 4 views
0

Ich habe ein animiertes Diagramm, das Netzwerk-Nutzungsverlauf erhält und skaliert die y-Grenzen dynamisch je nach der Größe der relevanten Daten übergeben wird. Wie bekomme ich meine y-Tick-Labels, um die sich ändernden y-Grenzen widerzuspiegeln? Alles funktioniert gut, wenn ich blit=Flase alles Updates gut eingestellt, aber ich will nicht alles, um jeden Tick zu aktualisieren, nur die y-Tick-Etiketten, wenn die y-Grenzen ändern? Wie aktualisiere oder zeichne ich einfach die y-Tick-Etiketten?Wie aktualisiere ich Matplotlib-Tick-Etiketten dynamisch

def resize(self, y_data): 
    cur_max = max(y_data) 
    if cur_max > self.ax.get_ylim()[1]: # if cur_max > upper y limit.. 
     self.ax.set_ylim(-1, cur_max + cur_max * .10) # increase upper y limit to fit cur_max 
     ### update/redraw tick labels? ### 
    if self.ax.get_ylim()[1] * .25 > cur_max > 0: # if 1/4 the upper y limit > cur_max and cur_max > 0... 
     self.ax.set_ylim(-1, cur_max * .50) # set upper y limit 1/2 its current size 
     ### update/redraw tick labels? ### 
+0

Wenn die ylabels Aktualisierung, die graphisch dargestellten Daten muss ebenfalls aktualisiert werden. Nehmen wir an, Sie haben Ylimits (0,6) und einen Punkt bei y = 3. Dann aktualisierst du die Ylimits auf (0,10) den Punkt, der anfangs in der Mitte des Graphen war, muss jetzt im unteren Teil davon sein, richtig? Das heißt, es ist ein wenig unklar, was Sie erreichen wollen. Die Verwendung von 'blit = False' scheint mir gut zu sein. – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest Die Skalierung der zu zeichnenden Daten ändert sich dramatisch von wenigen Bytes pro Sekunde zu vielen Tausend pro Sekunde, abhängig von der Netzwerklast. Wenn es auf viele tausend pro Sekunde springt, passt es die y-Grenze an, um auf den neuen y-Bereich zu skalieren, der für die eingehenden Daten geeignet ist, wodurch die vorherigen graphischen Daten, die in den Dutzenden von Bytes pro Sekunde liegen, unbedeutend sind. – HexxNine

+0

@ImportanceOfBeingErnest Die Grafiklinie wird mit der neuen Y-Skalierung aktualisiert, wodurch die Linie, in der die Daten in den 10er-Jahren lagen und jetzt nur die Spitzenwerte der 1000er anzeigen, effektiv abgeflacht wird. Das Problem besteht darin, dass die y-Tick-Beschriftungen nicht aktualisiert werden, wenn das y-Limit geändert wird. Die Daten der graphischen Linien liegen also in den 1000-er Jahren, aber die y-Tick-Beschriftungen zeigen weiterhin 1-100. Wenn ich jedoch die Größe des Fensters ändere, werden die y-Tick-Labels aktualisiert. Ich denke also, eine Lösung besteht darin, herauszufinden, welche Funktion aufgerufen wird, um die Achsen-/Hilfsstrichbeschriftungen neu zu zeichnen, wenn die Größe des Fensters geändert wird. – HexxNine

Antwort

0

Ich denke, was Sie brauchen, ist einen entsprechenden tick-Locator zu wählen und/oder Formatierer tick: eine Funktion, die dynamisch aufgerufen wird, die Zecken und Etikett zu verlagern, wenn die Achse Grenzen verändert werden.

alle Dokumente finden Sie hier: http://matplotlib.org/api/ticker_api.html

Sie Ihre eigenen Locator nach dem Beispiel unter vordefinierten Locators (zB LinearLocator) oder definieren können:

import matplotlib.pyplot as plt 
from matplotlib import ticker 
import numpy as np 

#- define the data 
x = np.linspace(0., 1., 100) 
y = np.random.randn(len(x)) 

#- plot it 
ax = plt.gca() 
ax.plot(x, y, 'k') 

#- define your own locator based on ticker.LinearLocator 
class MyLocator(ticker.LinearLocator): 
    def tick_values(self, vmin, vmax): 
     "vmin and vmax are the axis limits, return the tick locations here" 
     return [vmin, 0.5 * (vmin + vmax), vmax] 

#- initiate the locator and attach it to the current axis 
ML = MyLocator() 
ax.yaxis.set_major_locator(ML) 

plt.show() 
#- now, play with the zoom to see the y-ticks changing 
Verwandte Themen