2015-05-15 15 views
12

मुझे पता है कि हम matplotlib का उपयोग करके सरल 3-आयामी क्षेत्रों को बना सकते हैं, ऐसे क्षेत्र का उदाहरण documentation में शामिल है।एक घूमने योग्य 3 डी पृथ्वी बनाना

अब, हमारे पास matplotlib मॉड्यूल के हिस्से के रूप में warp विधि भी है, इसका उपयोग का उदाहरण here है।

गोलाकार छवि को गोलाकार करने के लिए। क्या 3 डी रोटेटेबल पृथ्वी बनाने के लिए इन विधियों को गठबंधन करना संभव है? जब तक इस समस्या के बारे में सोचने का मेरा तरीका यह नहीं है कि ऐसा करने में सक्षम होने के लिए आपको छवि का पिक्सेल डेटा लेना होगा और फिर 3 डी क्षेत्र की सतह के साथ पाप और कोसाइन अभिव्यक्तियों का उपयोग करके प्रत्येक पिक्सेल को प्लॉट करना होगा पहले उदाहरण में बनाया गया। इन बेलनाकार नक्शे के कुछ उदाहरणों में पाया जा सकता है here

मैं वैकल्पिक तरीके यह करने के लिए maya और blender के माध्यम से कर रहे हैं पता है, लेकिन मैं, matplotlib भीतर रहने के लिए यह करने के लिए के रूप में मैं इस साजिश का निर्माण करना चाहते हैं और फिर सक्षम हो प्रयास कर रहा हूँ डेटा की एक सरणी का उपयोग कर सतह पर geospatial डेटा साजिश करने के लिए।

उत्तर

7

दिलचस्प सवाल। मैं मूल रूप से सोच @Skeletor द्वारा उल्लिखित का पालन करें, और छवि को मैप करने की कोशिश की है ताकि यह 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() 

परिणाम: bluemarble.jpg shown in 3D with plot_surface

0

मैं निम्नलिखित समाधान की कल्पना कर सकता हूं: numpy.roll का उपयोग करके आप प्रत्येक कॉल के साथ एक कॉलम (अयस्क अधिक) द्वारा अपनी सरणी को स्थानांतरित कर सकते हैं। तो आप पृथ्वी की सतह की अपनी छवि को टेम्पलेट के रूप में एक सुस्त सरणी में लोड कर सकते हैं और घुमावदार छवि को jpg में निर्यात कर सकते हैं। यह आप वार उदाहरण के रूप में दिखाया गया है।

2

यहाँ मैं कुछ घंटे पहले बनाया:

पहले हम की जरूरत पुस्तकालयों आयात:

from mpl_toolkits.basemap import Basemap 
import matplotlib.pyplot as plt 
import imageio 
दूसरे

, हम आंकड़े बनाने के लिए और संग्रहीत उन्हें png हमारी निर्देशिका में: ध्यान दें कि मैं 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() 

लिखा था और अंत में हम एक एनिमेटेड GIF में सभी छवियों शामिल हो सकते हैं:

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) 

और उसके बाद परिणाम का आनंद: enter image description here