2012-01-20 29 views
6

Tôi có một mảng các giá trị y tạo thành một dòng. Ngoài ra, tôi có một mảng với cùng số phần tử như mảng y của các giá trị từ 0 đến 1. Chúng ta sẽ gọi mảng này là 'z'. Tôi muốn vẽ mảng các giá trị y sao cho màu của mỗi điểm tương ứng với giá trị z.gnuplot biến linecolor trong matplotlib?

Trong gnuplot, bạn có thể làm điều này bằng cách sử dụng 'biến lc':

plot ’data’ using 1:2:3 with points lc variable 

Sử dụng những lời khuyên từ đây: Matplotlib scatterplot; colour as a function of a third variable , tôi đã có thể sử dụng một biểu đồ phân tán, mà đã làm việc:

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() 

có cách nào để làm điều này với phương pháp cốt truyện trong matplotlib, tương tự như này?

plt.plot(x, y, c=z) 

Khi tôi thử mã trên, tất cả các dòng chỉ xuất hiện màu đen.

+0

Trong gnuplot 'lc variable' chọn * Chỉ số loại dòng * dựa trên giá trị của cột cuối cùng. Để sử dụng nó làm màu, hãy sử dụng ví dụ: 'lc palette z'. – Christoph

Trả lời

2

bạn có thể sử dụng phân tán:

plt.scatter(range(len(y)), y, c=z, cmap=cm.hot) 

ở đây bạn có phiên -pylab ipython:

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> 

enter image description here

Nếu bạn muốn sử dụng cốt truyện bạn có thể lấy con số tương đương như ở trên với (phiên pycrust):

>>> 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() 
>>> 
+0

Cảm ơn joaquin. Tôi đã quyết định sử dụng phân tán thay vì cốt truyện. –

17

Tôi đã có cùng một vấn đề: muốn cốt truyện (các) dòng có màu không đồng nhất, mà tôi muốn phụ thuộc vào biến thứ ba (z).

Nhưng tôi definitelly muốn sử dụng một dòng, không đánh dấu (như trong câu trả lời của @ joaquin). Tôi đã tìm thấy giải pháp trong một số matplotlib gallery example, sử dụng lớp matplotlib.collections.LineCollection (liên kết here).

Dưới đây là ví dụ của tôi, mà âm mưu quỹ đạo trong một bản đồ cơ sở, tô màu chúng theo chiều cao của nó:

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() 

height dependent trajectories

+0

Ví dụ rất hay! – Christoph

+0

Nếu bạn muốn chuyển đổi mượt mà hơn giữa các đoạn đường, bạn có thể thực hiện 'segment = np.concatenate ([điểm [: - 2], điểm [1: -1], điểm [2:]], trục = 1)' thay thế. – shockburner

Các vấn đề liên quan