python - for - gnuplot linecolor variable en matplotlib?
colores brewer (2)
Tengo una matriz de valores y que forman una línea. Además, tengo una matriz con la misma cantidad de elementos que la matriz y de valores que van de 0 a 1. Llamaremos a esta matriz ''z''. Quiero trazar la matriz de valores y para que el color de cada punto se corresponda con el valor z.
En gnuplot, puedes hacer esto usando la ''variable de lc'':
plot ’data’ using 1:2:3 with points lc variable
Usando el consejo de aquí: Matplotlib scatterplot; color como una función de una tercera variable , Pude usar un diagrama de dispersión, que funcionó:
import matplotlib as mpl
import matplotlib.pyplot as plt
plt.scatter(x, y, c=z, s=1, edgecolors=''none'', cmap=mpl.cm.jet)
plt.colorbar()
plt.show()
¿Hay alguna manera de hacer esto con el método de trazado en matplotlib, similar a esto?
plt.plot(x, y, c=z)
Cuando probé el código anterior, todas las líneas aparecieron negras.
puedes usar scatter:
plt.scatter(range(len(y)), y, c=z, cmap=cm.hot)
Aquí tienes la sesión ipython -pylab:
In [27]: z = [0.3,0.4,0.5,0.6,0.7,0.2,0.3,0.4,0.5,0.8,0.9]
In [28]: y = [3, 7, 5, 6, 4, 8, 3, 4, 5, 2, 9]
In [29]: plt.scatter(range(len(y)), y, s=60, c=z, cmap=cm.hot)
Out[29]: <matplotlib.collections.PathCollection at 0x9ec8400>
Si desea utilizar un gráfico, puede obtener la cifra equivalente a la anterior con (sesión de pírculo):
>>> from matplotlib import pyplot as plt
>>> from matplotlib import cm
>>> y = [3,7,5,6,4,8,3,4,5,2,9]
>>> z = [0.3,0.4,0.5,0.6,0.7,0.2,0.3,0.4,0.5,0.8,0.9]
>>> for x, (v, c) in enumerate(zip(y,z)):
... plt.plot(x,v,marker=''o'', color=cm.hot(c))
...
[<matplotlib.lines.Line2D object at 0x0000000008C42518>]
[<matplotlib.lines.Line2D object at 0x0000000008C426D8>]
[<matplotlib.lines.Line2D object at 0x0000000008C42B38>]
[<matplotlib.lines.Line2D object at 0x0000000008C452B0>]
[<matplotlib.lines.Line2D object at 0x0000000008C45438>]
[<matplotlib.lines.Line2D object at 0x0000000008C45898>]
[<matplotlib.lines.Line2D object at 0x0000000008C45CF8>]
[<matplotlib.lines.Line2D object at 0x0000000008C48198>]
[<matplotlib.lines.Line2D object at 0x0000000008C485F8>]
[<matplotlib.lines.Line2D object at 0x0000000008C48A58>]
[<matplotlib.lines.Line2D object at 0x0000000008C4B1D0>]
>>> plt.show()
>>>
Tuve el mismo problema: quería trazar línea (s) con un color no uniforme, que quería que dependiera de una tercera variable (z).
Pero yo definitivamente quería usar una línea, no marcadores (como en la respuesta de @ joaquin). Encontré una solución en un ejemplo de la galería matplotlib , usando la clase matplotlib.collections.LineCollection
(enlace aquí ).
Aquí está mi ejemplo, que traza trayectorias en un mapa base, y las colorea de acuerdo con su altura:
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
from matplotlib.collections import LineCollection
import numpy as np
m = Basemap(llcrnrlon=-42,llcrnrlat=0,urcrnrlon=5,urcrnrlat=50, resolution=''h'')
fig = plt.figure()
m.drawcoastlines()
m.drawcountries()
for i in trajectorias:
# for each i, the x (longitude), y (latitude) and z (height)
# are read from a file and stored as numpy arrays
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(''Spectral''),
norm=plt.Normalize(250, 1500))
lc.set_array(z)
lc.set_linewidth(2)
plt.gca().add_collection(lc)
axcb = fig.colorbar(lc)
axcb.set_label(''cota (m)'')
plt.show()