2016-11-07 3 views
1

Я ищу сделать сюжет, похожий на один found here, с той простой разницей, что я хотел бы установить расстояние от центра для каждой точки. Т.е., учитывая кусочек сюжета, это круг, где я бы хотел, чтобы каждая из точек находилась на определенном расстоянии от центра.Matplotlib: Plot 2d array радиально сделать 3d Scatterplot

Что я стартовое с учетом простой модификацией ранее упомянутый ответ:

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib 
import numpy as np 
from scipy.interpolate import interp1d 
from matplotlib import cm 
from matplotlib import pyplot as plt 
step = 0.04 
maxval = 1.0 
fig = plt.figure() 
ax = Axes3D(fig) 
# u here would define the desired distance from radial axis 
# u=np.array([0,1,2,1,0,2,4,6,4,2,1]) 
v=np.array([4,4,6,3,6,4,1,4,4,4,4]) 
r=np.array([0,1,2,3,4,5,6,7,8,9,10]) 
f=interp1d(r,u) 

# walk along the circle 
p = np.linspace(0,2*np.pi,len(r)) 
R,P = np.meshgrid(r,p) 
# transform them to cartesian system 
X,Y = R*np.cos(P),R*np.sin(P) 

Z=f(R) 

ax.scatter(X, Y, Z)#, rstride=1, cstride=1, cmap=cm.jet) 
ax.set_xticks([]) 
fig.savefig(str(output_prefix + '3d..png'), dpi=(200)) 

enter image description here То, что я хотел бы построить (извинения за размытый рисунок): enter image description here

I попытались использовать interp2d, чтобы добавить переменную u, прокомментированную выше, но не повезло. Изменение Z на массив u породило ошибку, что X, Y и Z должны быть одного размера ("Argument 'zs' must be of same size as 'xs' ", понятно, как X и Y теперь интерполированы) Что мне нужно сделать? Любые советы будут оценены!

ответ

0

Я не знаю точно, что вы имели в виду в своем вопросе. Я сделал v как смещение центра кругов по оси х.

from mpl_toolkits.mplot3d import Axes3D 
import numpy as np 
from scipy.interpolate import interp1d 
from matplotlib import pyplot as plt 
step = 0.04 
maxval = 1.0 
fig = plt.figure() 
ax = Axes3D(fig) 
# v here would define the desired distance from radial axis 
u=np.array([0,1,2,1,0,2,4,6,4,2,1]) 
v=np.array([4,4,6,3,6,4,1,4,4,4,4]) 
r=np.array([0,1,2,3,4,5,6,7,8,9,10]) 
f=interp1d(r,u) 

# walk along the circle 
V = np.tile(v, (len(u), 1)) 
p = np.linspace(0,2*np.pi,len(r)) 
R,P = np.meshgrid(r,p) 
# transform them to cartesian system 
X,Y = V + R*np.cos(P),R*np.sin(P) 

Z=f(R) 

ax.scatter(X, Y, Z)#, rstride=1, cstride=1, cmap=cm.jet) 
ax.set_xticks([]) 
plt.show() 
Смежные вопросы