2013-03-25 73 views
13

Tôi đã googling khá một thời gian với không thành công ... có lẽ từ khóa của tôi chỉ là tệ hại. Dù sao, giả sử tôi có ba 1D numpy.ndarray s cùng độ dài tôi muốn vẽ chúng trong 3D dưới dạng quỹ đạo. Hơn nữa, tôi muốn để có thể làm một trong những điều sau đây:Màu đường của đường cong tham số 3D trong python's matplotlib.pyplot

  1. Thay đổi màu sắc của dòng là một hàm của z
  2. Thay đổi màu sắc của dòng như một hàm của thời gian (ví dụ: chỉ số trong mảng)

This demo có một ví dụ về thực hiện một đường cong như:

import matplotlib as mpl 
from mpl_toolkits.mplot3d import Axes3D 
import numpy as np 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.gca(projection='3d') 
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100) 
z = np.linspace(-2, 2, 100) 
r = z**2 + 1 
x = r * np.sin(theta) 
y = r * np.cos(theta) 
ax.plot(x, y, z) 

plt.show() 

enter image description here

Nhưng làm cách nào để đạt được 1 hoặc 2? Giải pháp cho chỉ một hoặc khác được hoan nghênh! Cảm ơn trước.

Trả lời

12

Cũng giống như các ô 2d thông thường, bạn không thể có độ dốc màu dọc theo đường bình thường. Tuy nhiên, bạn có thể làm điều đó với scatter:

import matplotlib as mpl 
from mpl_toolkits.mplot3d import Axes3D 
import numpy as np 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.gca(projection='3d') 
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100) 
z = np.linspace(-2, 2, 100) 
r = z**2 + 1 
x = r * np.sin(theta) 
y = r * np.cos(theta) 

#1 colored by value of `z` 
ax.scatter(x, y, z, c = plt.cm.jet(z/max(z))) 

#2 colored by index (same in this example since z is a linspace too) 
N = len(z) 
ax.scatter(x, y, z, c = plt.cm.jet(np.linspace(0,1,N))) 

plt.show() 

tôi thích @Junuxx'shack vì vậy tôi áp dụng nó ở đây:

for i in xrange(N-1): 
    ax.plot(x[i:i+2], y[i:i+2], z[i:i+2], color=plt.cm.jet(255*i/N)) 

2-Color by index 2-Color lines by index

+0

Tôi nghĩ rằng báo cáo kết quả đầu tiên là không chính xác đúng, xem câu trả lời của tôi. Nhưng +1 để trình diễn bản đồ phản lực bao gồm chuẩn hóa. – Junuxx

+0

Vâng, đó là sự thật về mặt kỹ thuật, do đó bạn phải vẽ các đối tượng 'N'' line3D', nhưng hack của bạn khá tuyệt vời :) – askewchan

+1

Thật tuyệt vời, nhờ bạn cả @Junuxx và askewchan –

10

Bạn có thể vẽ mỗi đoạn thẳng riêng , như hình dưới đây. Điều này chỉ lặp hơn 6 màu được xác định trước, vì câu trả lời của @ askewchan đã chứng minh tốt cách sử dụng bản đồ màu.

cols = 'rgbcmy' 

for i in range(len(x)-1): 
    ax.plot(x[i:i+2], y[i:i+2], z[i:i+2], color=cols[i%6]) 

enter image description here

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