Pandas Dataframe Multicolor Line plot

Tengo un Dataframe de Pandas con un índice DateTime y dos columnas que representan la velocidad del viento y la temperatura ambiente. Aquí están los datos de medio día.

temp winds 2014-06-01 00:00:00 8.754545 0.263636 2014-06-01 01:00:00 8.025000 0.291667 2014-06-01 02:00:00 7.375000 0.391667 2014-06-01 03:00:00 6.850000 0.308333 2014-06-01 04:00:00 7.150000 0.258333 2014-06-01 05:00:00 7.708333 0.375000 2014-06-01 06:00:00 9.008333 0.391667 2014-06-01 07:00:00 10.858333 0.300000 2014-06-01 08:00:00 12.616667 0.341667 2014-06-01 09:00:00 15.008333 0.308333 2014-06-01 10:00:00 17.991667 0.491667 2014-06-01 11:00:00 21.108333 0.491667 2014-06-01 12:00:00 21.866667 0.395238 

Me gustaría trazar estos datos como una línea donde el color cambia según la temperatura. Así, de rojo claro a rojo oscuro, por ejemplo, la temperatura es más alta.

Encontré este ejemplo de líneas multicolores con matplotlib, pero no tengo idea de cómo usar esto con un dataframe de pandas. ¿Alguien tiene una idea de lo que podría hacer? Si es posible hacer esto, ¿también sería posible como característica adicional cambiar el ancho de la línea de acuerdo con la velocidad del viento? Así que cuanto más rápido es el viento, más ancha es la línea.

¡Gracias por cualquier ayuda!

El método de plot incorporada en pandas probablemente no podrá hacerlo. matplotlib extraer los datos y matplotlib utilizando matplotlib .

 from matplotlib.collections import LineCollection import matplotlib.dates as mpd x=mpd.date2num(df.index.to_pydatetime()) y=df.winds.values c=df['temp'].values points = np.array([x, y]).T.reshape(-1, 1, 2) segments = np.concatenate([points[:-1], points[1:]], axis=1) lc = LineCollection(segments, cmap=plt.get_cmap('copper'), norm=plt.Normalize(0, 10)) lc.set_array(c) lc.set_linewidth(3) ax=plt.gca() ax.add_collection(lc) plt.xlim(min(x), max(x)) ax.xaxis.set_major_locator(mpd.HourLocator()) ax.xaxis.set_major_formatter(mpd.DateFormatter('%Y-%m-%d:%H:%M:%S')) _=plt.setp(ax.xaxis.get_majorticklabels(), rotation=70 ) plt.savefig('temp.png') 

introduzca la descripción de la imagen aquí

Hay dos temas que vale la pena mencionar,

  • el rango del gradiente de color está controlado por norm=plt.Normalize(0, 10)
  • pandas y matplotlib trazan series de tiempo de manera diferente, lo que requiere que el df.index se convierta a float antes de trazar. Y al modificar los major_locators , obtendremos los xaxis majorticklabels nuevamente en el formato de fecha y hora.
  • El segundo problema puede causar problemas cuando queremos trazar más de una línea (los datos se trazarán en dos rangos de x separados):

     #follow what is already plotted: df['another']=np.random.random(13) print ax.get_xticks() df.another.plot(ax=ax, secondary_y=True) print ax.get_xticks(minor=True) [ 735385. 735385.04166667 735385.08333333 735385.125 735385.16666667 735385.20833333 735385.25 735385.29166667 735385.33333333 735385.375 735385.41666667 735385.45833333 735385.5 ] [389328 389330 389332 389334 389336 389338 389340] 

    Por lo tanto, necesitamos hacerlo sin el método .plot() de pandas :

     ax.twinx().plot(x, df.another) 

    introduzca la descripción de la imagen aquí