2012-07-13 18 views
6

Tôi có một nhiệm vụ đơn giản nên có một giải pháp đơn giản, nhưng tôi đã cố gắng trong nhiều ngày nay. Tôi cố gắng cụ thể.Colormap có kích thước của facecolors với mplot3d

  • Tôi cố vẽ một bề mặt bằng mplot3d của matplotlib và plot_surface. Khi tôi vẽ bề mặt của tập dữ liệu 'z' và cố gắng phóng tỷ lệ bản đồ thành giá trị lớn nhất định, tôi thay đổi thuộc tính 'vmax' thành giá trị này. Điều đó hoạt động rất tốt.

  • Khi tôi cố vẽ một bề mặt của một tập dữ liệu (z) và sử dụng các facecolors của tập dữ liệu thứ hai (fc), điều này cũng hoạt động tốt.

  • Khi tôi muốn chia tỷ lệ bản đồ của các facecolors, thuộc tính vmax bị loại bỏ bởi các giá trị facecolors. Vmax do đó không có hiệu lực (try1). Các dòng cũng biến mất, nhưng đó là một vấn đề khác.

  • Đồng thời cố thay đổi giá trị của tập dữ liệu facecolor (fc) không có hiệu ứng mong muốn (try2).

tôi cố gắng để có được một nhân vật với một bản đồ màu thu nhỏ (như trong hình 'thu nhỏ' phía dưới) nhưng quy mô đến facecolors, và không phải là z-giá trị.

Đoạn code dưới đây là những gì tôi có bây giờ, và kết quả như thế này:

enter image description here

Có ai biết những gì tôi đang thiếu ở đây? Bất kỳ suy nghĩ được đánh giá cao!

import pylab as plt 
import numpy as np 
from mpl_toolkits.mplot3d import Axes3D 

plt.ion() 

# creating dataset 
profile = np.arange(20)**2 
z = profile.repeat(20).reshape(20,20) 
fc= np.rot90(z.copy()) 

x = np.arange(z.shape[0]) 
y = np.arange(z.shape[1]) 
X, Y = np.meshgrid(x,y) 

# plotting 
vmax = 100 
fig = plt.figure() 
ax = fig.add_subplot(1,4,1, projection='3d', azim=210) 
ax.plot_surface(X,Y,z, cmap=plt.cm.jet, cstride=1, rstride=1) 
ax.set_title('normal') 

ax = fig.add_subplot(1,4,2, projection='3d', azim=210) 
ax.plot_surface(X,Y,z, cmap=plt.cm.jet, cstride=1, rstride=1, vmax=vmax) 
ax.set_title('scaled') 

ax = fig.add_subplot(1,4,3, projection='3d', azim=210) 
ax.plot_surface(X,Y,z, facecolors=plt.cm.jet(fc), cstride=1, rstride=1, vmax=vmax) 
ax.set_title('rotated (attempt1)') 

ax = fig.add_subplot(1,4,4, projection='3d', azim=210) 
fc[fc> vmax] = vmax 
ax.plot_surface(X,Y,z, facecolors=plt.cm.jet(fc), cstride=1, rstride=1) 
ax.set_title('rotated (attempt2)') 
+0

Bạn có tìm hiểu cách lấy lại các đường màu đen không? Tôi nghĩ rằng tôi đang gặp vấn đề tương tự: http://stackoverflow.com/questions/12355410/fine-tuning-a-surf-plot-using-mplot3d và tôi đang đấu tranh để có được những dòng hiển thị. – Dan

+1

Tôi thấy vấn đề của bạn đã được giải quyết ngay bây giờ, tuyệt vời :-) – Niels

Trả lời

3

Một - bẩn - giải pháp sẽ được rescale các facecolors cắt bớt như vậy mà tối đa bằng mức tối đa của bản đồ chiều cao của bạn (ngoài cơ bản những gì bạn đề nghị như nỗ lực 2):

ax.plot_surface(X,Y,z, facecolors=plt.cm.jet(np.clip(fc,0,vmax)*np.max(z)/vmax), cstride=1, rstride=1, vmax=vmax) 

Điều này có mang lại kết quả bạn đang tìm kiếm không?

+0

có, điều đó thực hiện chính xác những gì tôi cần. Cảm ơn rất nhiều! – Niels

+0

Chỉ cần làm :-), cảm ơn một lần nữa .. – Niels

+0

@Niels upvoting câu trả lời hữu ích làm cho một số người có nhiều khả năng giúp đỡ trong tương lai. Chấp nhận một câu trả lời là tốt đẹp, chấp nhận một câu trả lời mà bạn không đánh dấu là "hữu ích" có vẻ kỳ quặc. – msw

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