controlando los valores de fecha de las marcas x

Tengo la siguiente muestra de datos como pares x, y y tanto x como y son sellos de tiempo Unix:

1354648326,1354648326 1354649456,1371775551 1354649664,1429649819 1354649667,1429644021 1354649683,1356976159 1354649767,1441369794 1354649863,1414467362 1354650486,1366297316 1354650757,1456962664 1354650789,1359398128 1354651552,1354656458 1354651555,1368631443 1354651591,1456420412 1354651616,1354651616 1354651715,1444573208 1354652048,1454443352 1354652382,1394722546 1354652687,1355993864 1354653448,1387378662 1354653731,1396094300 1354653769,1417765024 1354654110,1457230519 1354654111,1452854788 1354654179,1423877890 1354654266,1355148505 1354654374,1446848232 1354654374,1456864004 1354654615,1355858928 1354654700,1456945892 1354654707,1456265183 1354654744,1442939141 1354654747,1388436654 1354654771,1449799848 1354654775,1355177773 1354654808,1456857861 1354654809,1411369798 1354654855,1355934384 1354654915,1457100468 1354654962,1388784204 1354655085,1454446403 1354655219,1364196550 1354655232,1387214819 1354655262,1377170885 1354655264,1369689630 1354655289,1388750388 1354655389,1387387305 1354655434,1389255185 1354655436,1387165968 1354655592,1374369153 1354655661,1456912753 1354655811,1354718201 1354655889,1426675579 1354656139,1420486774 

y quiero trazarlo como dispersión, pero sin el formato de marca de tiempo feo que se muestra en los ejes x e y. En su lugar, quería trazar las fechas en el eje (en formato YYYY-MM-DD o cualquier otro formato legible) y mostrarlas con una diferencia de 3 meses.

Tengo el siguiente código:

 ax.set_xticklabels(getLabels(s,t),rotation=20) 

donde getLabels(s,t) se define como:

 def getLabels(s,t): #s and t are unix time stamps labels =[] for x in pd.date_range(start=s, end=t, freq='3M'): labels.append(str(x).replace(" 00:00:00","")) print labels return labels 

y devuelve algo como:

 ['2012-06-30', '2012-09-30', '2012-12-31', '2013-03-31', '2013-06-30', '2013-09-30', '2013-12-31', '2014-03-31', '2014-06-30', '2014-09-30', '2014-12-31', '2015-03-31', '2015-06-30', '2015-09-30', '2015-12-31', '2016-03-31'] ['2012-06-30', '2012-09-30', '2012-12-31', '2013-03-31', '2013-06-30', '2013-09-30', '2013-12-31', '2014-03-31', '2014-06-30', '2014-09-30', '2014-12-31', '2015-03-31', '2015-06-30', '2015-09-30', '2015-12-31', '2016-03-31'] 

Ahora, el problema es que las tags de las marcas del eje x no se muestran exactamente como se muestran en el conjunto de fechas anterior, sino que solo muestra las primeras 6 fechas (a partir de 2012-09-30 y terminando con 2013-12-31) )

¿Cuál es el problema?

Su problema es que su gráfico solo tiene cinco tics, por lo que solo puede mostrar cinco tags. Si desea mostrar todas las tags, debe asegurarse de que tiene el mismo número de marcas.

No tengo pandas instalados, y de todos modos, no tengo los datos completos, así que no puedo volver a crear las tags. Simplemente he copiado la lista de tags que ha proporcionado. También he ‘diseñado por ingeniería inversa’ el mínimo y el máximo para el eje x de las tags (de modo que los datos se trazan en el lugar correcto).

Esta línea: ax.xaxis.set_ticks(np.arange(min_x, max_x, int((max_x-min_x)/len(labels)))) Asegura que tenga el mismo número de marcas que las tags.

Tenga en cuenta que también he cambiado la alineación horizontal de las tags de modo que, incluso cuando están aplastadas, todavía está claro a qué marca corresponde la etiqueta. Esta porción de los datos parece trazar en la ubicación correcta, así que estoy bastante seguro de que las tags están en el lugar correcto.

(Obviamente el eje y puede ser tratado de la misma manera)

 import matplotlib.pyplot as plt import numpy as np import time import datetime labels =['2012-06-30', '2012-09-30', '2012-12-31', '2013-03-31', '2013-06-30', '2013-09-30', '2013-12-31', '2014-03-31', '2014-06-30', '2014-09-30', '2014-12-31', '2015-03-31', '2015-06-30', '2015-09-30', '2015-12-31', '2016-03-31'] x = [] y = [] with open('data.txt','r') as myfile: for line in myfile: _x, _y = line.strip().split(',') x.append(int(_x)) y.append(int(_y)) min_x = int(time.mktime(datetime.datetime.strptime('2012-06-30','%Y-%m-%d').timetuple())) max_x = int(time.mktime(datetime.datetime.strptime('2016-03-31','%Y-%m-%d').timetuple())) print (datetime.datetime.fromtimestamp(min(x)).strftime('%Y-%m-%d')) # Confirm that we are plotting in the right place for this sample fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.set_xlim(min_x, max_x) ax.xaxis.set_ticks(np.arange(min_x, max_x, int((max_x-min_x)/len(labels)))) ax.set_xticklabels(labels, rotation=20, horizontalalignment = 'right') ax.scatter(x,y) plt.show() 

introduzca la descripción de la imagen aquí

Los límites de sus datos del eje x son solo del 2012-12-05 06:12:06 al 2012-12-05 08:22:19 . Tienes que ampliar el rango de fechas.

Sin embargo, puede usar este código para establecer tics en el eje x cada 3 meses:

 import matplotlib.pyplot as plt from itertools import izip import datetime import numpy as np import pandas as pd def grouped(iterable, n): return izip(*[iter(iterable)]*n) def getLabels(s,t): labels =[] for x in pd.date_range(start=s, end=t, freq='3M'): labels.append(x.strftime("%Y-%m-%d")) print labels return labels arr = [1354648326,1354648326, 1354649456,1371775551, ... 1354655889,1426675579, 1354656139,1420486774] # convert timestamps to datetime objects X = list() Y = list() for x, y in grouped(arr, 2): X.append(datetime.datetime.fromtimestamp(x)) Y.append(datetime.datetime.fromtimestamp(y)) # range of X list is only one day: 2012-12-05 # you have to enlarge data of X print np.min(X),np.max(X) # sample data data = np.random.uniform(-10, 10, size=len(X)*len(Y)) # plot plt.scatter(X, Y, s = data) ax = plt.gca() # set limits for X-axis ax.set_xlim([np.min(X),np.max(X)]) # generate labels xlabels = getLabels(np.min(X),np.max(X)) # set ticks and labels ax.set_xticks(xlabels) ax.set_xticklabels(xlabels,rotation=20) plt.show() 

Si amplío los límites del eje x obtengo algo como esto en sus datos:

 ... # plot plt.scatter(X, Y, s = data) ax = plt.gca() # set limits for X-axis xmin = datetime.datetime(2012,1,1,0,0,0) # np.min(X) xmax = xmin + datetime.timedelta(days = 360) # np.max(X) ax.set_xlim([xmin, xmax]) # generate labels every 3 month xlabels = getLabels(xmin, xmax) # set ticks and labels ax.set_xticks(xlabels) ax.set_xticklabels(xlabels,rotation=20) plt.show() 

introduzca la descripción de la imagen aquí

Si desea tags de marca de fecha y hora más complicadas, lea esta respuesta .