2012-01-17 33 views
12

Làm thế nào tôi có thể tạo một ô 3D với một gradient màu cho các điểm? Xem ví dụ bên dưới, hoạt động cho ô phân tán 2D.Matplotlib 3D scatter plot với gradient màu

Chỉnh sửa (nhờ Chris): Những gì tôi mong đợi thấy từ ô 3D là độ dốc màu của các điểm khác nhau, từ đỏ sang xanh lục như trong ô phân tán 2D. Những gì tôi thấy trong ô phân tán 3D chỉ là các điểm màu đỏ.

Giải pháp: vì một số lý do (liên quan đến ví dụ về gradient mà tôi đã sao chép ở nơi khác), tôi đặt xrange thành len-1, điều này sẽ làm rối tung mọi thứ trong ô 3D.

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

# Create Map 
cm = plt.get_cmap("RdYlGn") 

x = np.random.rand(30) 
y = np.random.rand(30) 
z = np.random.rand(30) 
#col = [cm(float(i)/(29)) for i in xrange(29)] # BAD!!! 
col = [cm(float(i)/(30)) for i in xrange(30)] 

# 2D Plot 
fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.scatter(x, y, s=10, c=col, marker='o') 

# 3D Plot 
fig = plt.figure() 
ax3D = fig.add_subplot(111, projection='3d') 
ax3D.scatter(x, y, z, s=10, c=col, marker='o') 

plt.show() 
+0

Có gì sai với âm mưu phân tán 3D? Những gì bạn mong đợi để nhìn thấy từ nó và những gì bạn thực sự nhìn thấy? Từ bạn mã lệnh gọi đến ['Axes3D.scatter'] (http://matplotlib.sourceforge.net/mpl_toolkits/mplot3d/tutorial.html#scatter-plots) có vẻ ổn. – Chris

+0

Những gì tôi mong đợi để xem từ cốt truyện 3D là một gradient màu của các điểm khác nhau, từ màu đỏ sang màu xanh lá cây như trong ô phân tán 2D. Những gì tôi thấy trong âm mưu phân tán 3D chỉ là các điểm màu đỏ. –

Trả lời

0

Làm việc sau: Tôi không thể hiểu tại sao bạn không làm như vậy. Bạn sẽ có thể thiết lập màu sắc như một chuỗi các float RGBA, hoặc chỉ là một chuỗi các float.

# Create Map 
cm = plt.get_cmap("RdYlGn") 

x = np.random.rand(30) 
y = np.random.rand(30) 
z = np.random.rand(30) 
col = np.arange(30) 

# 2D Plot 
fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.scatter(x, y, s=10, c=col, marker='o') 

# 3D Plot 
fig = plt.figure() 
ax3D = fig.add_subplot(111, projection='3d') 
p3d = ax3D.scatter(x, y, z, s=30, c=col, marker='o')                     

plt.show() 

Tuy nhiên, để giúp phân tán, tôi thấy như sau, nó có thể liên quan.

A :class:`matplotlib.colors.Colormap` instance or registered 
    name. If *None*, defaults to rc ``image.cmap``. *cmap* is 
    only used if *c* is an array of floats. 
+1

Thêm ", cmap = cm" (ax3D.scatter (x, y, z, s = 30, c = col, điểm đánh dấu = 'o', cmap = cm)) vào hàm phân tán, tôi cũng có độ dốc màu trong âm mưu phân tán 3D. Những gì tôi nhớ bây giờ có vẻ là chiều sâu, nhưng tôi đoán tôi không thể có cả hai. –

+0

ý bạn là bạn không có chiều sâu? – Cenkoloji

15

Dưới đây là một ví dụ cho phân tán 3d với màu gradient:

import matplotlib.cm as cmx 
from mpl_toolkits.mplot3d import Axes3D 
def scatter3d(x,y,z, cs, colorsMap='jet'): 
    cm = plt.get_cmap(colorsMap) 
    cNorm = matplotlib.colors.Normalize(vmin=min(cs), vmax=max(cs)) 
    scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=cm) 
    fig = plt.figure() 
    ax = Axes3D(fig) 
    ax.scatter(x, y, z, c=scalarMap.to_rgba(cs)) 
    scalarMap.set_array(cs) 
    fig.colorbar(scalarMap) 
    plt.show() 

Tất nhiên, bạn có thể chọn quy mô dao động giữa các giá trị khác nhau, như 0 và 1.

+3

'ax.scatter (z, y, z, c = scalarMap.to_rgba (cs))' phải là 'ax.scatter (x, y, z, c = scalarMap.to_rgba (cs))' – orange

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