2016-04-16 4 views
3

На данный момент у меня есть рисунок, который выглядит так, enter image description hereПреобразование 2D рисунок в цилиндр в Python

Генерируется код:

import matplotlib.pyplot as plt 

import numpy as np 

data = np.random.rand(20,5) 
rows,cols = data.shape 

plt.imshow(data, interpolation='nearest', extent=[0.5, 0.5+cols, 0.5, 0.5+cols], cmap='bwr') 
plt.show() 

Однако я хотел бы, чтобы «сбросить» это в трехмерном цилиндре, соединяющем левый и правый края (как и с листом бумаги). Другими словами, левый край и правые края на самом деле являются одним и тем же ребром, поэтому я хотел бы объединить их вместе, чтобы сформировать цилиндр.

Как бы я это сделал?

+0

вы хотите 3D-фигуру? – Daniel

+0

Да, 3D-цилиндр, что я после – fosho

+0

У вас есть система, которая может отображать 3D-изображения? –

ответ

3

Poly3DCollection - метод выбора для любых 3D-полигонов в mplot3d.

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

fig = plt.figure() 
ax = fig.gca(projection='3d') 

nphi,nz=12,20 
r=1 # radius of cylinder 
phi = np.linspace(0,360, nphi)/180.0*np.pi 
z= np.linspace(0,1.0,nz) 
print z 

facecolors=['r','g','b','y'] 
cols=[] 
verts2 = [] 
for i in range(len(phi)-1): 
    cp0= r*np.cos(phi[i]) 
    cp1= r*np.cos(phi[i+1]) 
    sp0= r*np.sin(phi[i]) 
    sp1= r*np.sin(phi[i+1]) 

    for j in range(len(z)-1): 
     z0=z[j] 
     z1=z[j+1] 
     verts=[] 
     verts.append((cp0, sp0, z0)) 
     verts.append((cp1, sp1, z0)) 
     verts.append((cp1, sp1, z1)) 
     verts.append((cp0, sp0, z1)) 
     verts2.append(verts) 
     value=np.random.rand() 
     print value 
     col=plt.cm.bwr(value) 
     print col 
     cols.append(col) 

poly3= Poly3DCollection(verts2, facecolor=cols ) 

poly3.set_alpha(0.8) 
ax.add_collection3d(poly3) 
ax.set_xlabel('X') 
ax.set_xlim3d(-1, 1) 
ax.set_ylabel('Y') 
ax.set_ylim3d(-1, 1) 
ax.set_zlabel('Z') 
ax.set_zlim3d(0, 1) 
plt.show() 

enter image description here

+1

Не могли бы вы добавить некоторые комментарии, объясняющие это? Спасибо – fosho

+1

Также это не использует цветовую карту – fosho

+0

Я добавил цветовую палитру. В моих двух циклах я вручную создаю (x, y, z) вершины (четыре из них, называемые 'verts') для каждого прямоугольника. Каждый прямоугольник имеет нижний левый '(i, j)', нижний правый '(i + 1, j)', верхний правый '(i + 1, j + 1)' и верхний левый '(i, j + 1) 'vertex. Координата x идет с косинусом угла phi, y-координатой с синусом того же угла. Z-координата просто идет от 0 до 1 в 12 шагов (nz = 12). 'verts2' - это список, содержащий вершины всех прямоугольников. – roadrunner66

0

Вы можете использовать plot_surface:

import numpy as np 
import matplotlib.pyplot as plt 
import mpl_toolkits.mplot3d.axes3d as axes3d 

np.random.seed(2016) 
data = np.random.rand(12, 20) 
h, w = data.shape 
theta, z = np.linspace(0, 2 * np.pi, w), np.linspace(0, 1, h) 
THETA, Z = np.meshgrid(theta, z)  
X = np.cos(THETA) 
Y = np.sin(THETA) 

fig = plt.figure() 
ax = fig.add_subplot(1,1,1, projection='3d') 
cmap = plt.get_cmap('bwr') 
plot = ax.plot_surface(
    X, Y, Z, rstride=1, cstride=1, facecolors=cmap(data), 
    linewidth=0, antialiased=False, alpha=0.75) 

plt.show() 

дающий

enter image description here

Смежные вопросы