gnuplot переменная linecolor в matplotlib?
У меня есть массив значений Y, которые образуют линию. Кроме того, у меня есть массив с тем же количеством элементов, что и у массива значений в диапазоне от 0 до 1. Мы назовем этот массив "z". Я хочу построить массив значений y так, чтобы цвет каждой точки соответствовал значению z.
В gnuplot вы можете сделать это, используя переменную lc:
plot ’data’ using 1:2:3 with points lc variable
Используя совет отсюда: Matplotlib scatterplot; цвет как функция третьей переменной Я смог использовать точечный график, который работал:
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()
Есть ли способ сделать это с помощью метода plot в matplotlib, похожего на этот?
plt.plot(x, y, c=z)
Когда я попробовал приведенный выше код, все строки выглядели черными.
2 ответа
Вы можете использовать Scatter:
plt.scatter(range(len(y)), y, c=z, cmap=cm.hot)
здесь у вас есть сеанс 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>
Если вы хотите использовать plot, вы можете получить эквивалентную цифру, как указано выше (pycrust session):
>>> 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()
>>>
У меня была та же проблема: я хотел нарисовать линию (и) с неоднородным цветом, который я хотел, чтобы зависеть от третьей переменной (z).
Но я определенно хотел использовать строку, а не маркеры (как в ответе @joaquin). Я нашел решение в примере галереи Matplotlib, используя класс matplotlib.collections.LineCollection
(ссылка здесь).
Вот мой пример, который отображает траектории в базовой карте, раскрашивая их в соответствии с ее высотой:
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()