Ich habe eine Datei mit protokollierten Ereignissen. Jeder Eintrag hat eine Zeit und Latenz. Ich bin interessiert, die kumulative Verteilungsfunktion der Latenzen zu zeichnen. Ich bin am meisten an Tail-Latenzen interessiert, deshalb möchte ich, dass der Plot eine logarithmische Y-Achse hat. Ich bin an den Latenzen bei den folgenden Perzentilen interessiert: 90., 99., 99., 99. und 99.999. Hier ist mein Code so weit, dass ein regelmäßigen CDF Plot erzeugt:Logarithmische Darstellung einer kumulativen Verteilungsfunktion in Matplotlib
# retrieve event times and latencies from the file
times, latencies = read_in_data_from_file('myfile.csv')
# compute the CDF
cdfx = numpy.sort(latencies)
cdfy = numpy.linspace(1/len(latencies), 1.0, len(latencies))
# plot the CDF
plt.plot(cdfx, cdfy)
plt.show()
Ich weiß, was ich die Handlung aussehen soll, aber ich habe gekämpft, um es zu bekommen. Ich mag es so aussehen (ich habe dieses Grundstück nicht erzeugen):
machte die x-Achse logarithmisch einfach ist. Die y-Achse ist diejenige, die mir Probleme bereitet. Die Verwendung von set_yscale('log')
funktioniert nicht, weil es Potenzen von 10 verwenden möchte. Ich möchte wirklich, dass die Y-Achse die gleichen Ticklabels wie dieses Diagramm hat.
Wie kann ich meine Daten in eine logarithmische Darstellung wie diese bringen?
EDIT:
Wenn ich die yscale zu 'log' und ylim auf [0,1, 1], erhalte ich die folgende Handlung:
Das Problem ist, dass ein typisches Log-Scale-Plot auf einem Datensatz von 0 bis 1 konzentriert sich auf Werte nahe Null. Stattdessen möchte ich auf die Werte in der Nähe von 1 konzentrieren.
Welche Probleme haben Sie mit 'set_yscale ('symlog')'? – mziccard
Das Setzen von Etikettenpositionen ist auch eine ganz andere Geschichte. Ich nehme an, Sie könnten die Skalierung logarithmisch auf der y-Achse machen (es funktioniert, wenn Sie eine 0 oder -ve-Zahl haben, die Daten sind falsch) und dann die Beschriftungen adjustieren. –
Was meinen Sie, wenn Sie sagen, dass die Log-Y-Achse * "nicht funktioniert" *? Kannst du es uns zeigen? Es ist mathematisch nicht möglich, 0 auf einer logarithmischen Skala darzustellen, so dass der erste Wert entweder maskiert oder auf eine sehr kleine positive Zahl abgeschnitten werden muss. Sie können dieses Verhalten steuern, indem Sie entweder '' mask '' oder '' clip '' als 'nonposy = 'Parameter an' ax.set_yscale() 'übergeben. –