2015-05-15 37 views
12

Tôi biết chúng ta có thể tạo các quả cầu 3 chiều đơn giản bằng cách sử dụng matplotlib, một ví dụ về hình cầu như vậy được bao gồm trong documentation.Tạo một trái đất 3D xoay

Bây giờ, chúng tôi cũng có phương thức warp như một phần của mô-đun matplotlib, ví dụ về cách sử dụng của nó là here.

Để làm cong hình trụ vào hình cầu. Có thể kết hợp các phương pháp này để tạo ra một trái đất xoay 3D không? Trừ khi cách suy nghĩ của tôi về vấn đề này có vẻ như là để có thể làm điều này bạn sẽ phải lấy dữ liệu pixel của hình ảnh và sau đó vẽ từng điểm ảnh bằng cách sử dụng các biểu thức sin và cos dọc theo bề mặt của hình cầu 3D được tạo trong ví dụ đầu tiên. Một số ví dụ về những tấm bản đồ hình trụ có thể được tìm thấy here

Tôi biết cách thay thế để làm điều này là thông qua mayablender, nhưng tôi đang cố gắng để ở lại trong vòng matplotlib để làm điều này, như tôi muốn tạo ra âm mưu này và sau đó có thể để vẽ dữ liệu không gian địa lý lên bề mặt bằng cách sử dụng một mảng dữ liệu.

Trả lời

7

Câu hỏi thú vị. Tôi cố gắng để về cơ bản theo tư duy vạch ra bởi @Skeletor, và bản đồ hình ảnh để nó có thể được hiển thị với plot_surface:

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

# load bluemarble with PIL 
bm = PIL.Image.open('bluemarble.jpg') 
# it's big, so I'll rescale it, convert to array, and divide by 256 to get RGB values that matplotlib accept 
bm = np.array(bm.resize([d/5 for d in bm.size]))/256. 

# coordinates of the image - don't know if this is entirely accurate, but probably close 
lons = np.linspace(-180, 180, bm.shape[1]) * np.pi/180 
lats = np.linspace(-90, 90, bm.shape[0])[::-1] * np.pi/180 

# repeat code from one of the examples linked to in the question, except for specifying facecolors: 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

x = np.outer(np.cos(lons), np.cos(lats)).T 
y = np.outer(np.sin(lons), np.cos(lats)).T 
z = np.outer(np.ones(np.size(lons)), np.sin(lats)).T 
ax.plot_surface(x, y, z, rstride=4, cstride=4, facecolors = bm) 

plt.show() 

Kết quả: bluemarble.jpg shown in 3D with plot_surface

0

Tôi có thể tưởng tượng giải pháp sau: Sử dụng numpy.roll bạn có thể chuyển mảng của mình theo một cột (thêm quặng) với mỗi cuộc gọi. Vì vậy, bạn có thể tải hình ảnh bề mặt trái đất của bạn vào một mảng numpy như là một mẫu và xuất khẩu hình ảnh xoay thành một jpg. Điều này bạn âm mưu như thể hiện trong ví dụ dọc.

2

Dưới đây là những gì tôi thực hiện một số giờ trước:

Đầu tiên chúng tôi nhập khẩu các thư viện cần thiết:

from mpl_toolkits.basemap import Basemap 
import matplotlib.pyplot as plt 
import imageio 

Thứ hai, chúng tôi làm cho số liệu và lưu trữ chúng như png trong thư mục của chúng tôi: Lưu ý rằng tôi đã viết range(0,330,20)

for i in range(0,330,20): 
    my_map = Basemap(projection='ortho', lat_0=0, lon_0=i, resolution='l', area_thresh=1000.0) 
    my_map.bluemarble() 
    my_map.etopo() 
    name=str(i) 
    path='/path/to/your/directory/'+name 
    plt.savefig(path+'.png') 
    plt.show() 
    plt.clf() 
    plt.cla() 
    plt.close() 

Và cuối cùng chúng ta có thể tham gia tất cả các hình ảnh trong một GIF động:

images = [] 
for f in range(0,330,20): 
    images.append(imageio.imread("/path/to/your/directory/"+str(f)+".png")) 
    imageio.mimsave('movie.gif', images, duration=0.5) 

và sau đó thưởng thức kết quả: enter image description here

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