2017-08-16 5 views
1

に等間隔の球をプロットします。Pythonの:すべての最小値以上の球がある</p> <p><a href="https://i.stack.imgur.com/Oxjbx.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Oxjbx.jpg" alt="enter image description here"></a></p> <p>:私は少しこのようなプロットを作成しようとしていますmatplotlibの

表面はSIN(X)* SIN(y)をプロットして近似することができる。

import numpy as np 
import matplotlib.pyplot as plt 

def func(x, y): 
    return np.sin(2*np.pi*x)*np.sin(2*np.pi*y)/3 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
x = y = np.arange(-1.0, 1.0, 0.05) 
X, Y = np.meshgrid(x, y) 
zs = np.array([func(x,y) for x,y in zip(np.ravel(X), np.ravel(Y))]) 
Z = zs.reshape(X.shape) 

ax.plot_surface(X, Y, Z, color="grey") 
ax.set_zlim3d(-1,1) 

plt.show() 

Iこれに等間隔球を追加する方法が不明だが。誰も助けることができるだろうか?

+0

mayaviでは、溶液は次のようになります。私は、あなたが球をプロットする方法を見つけるあなたの検索の少しと思う。次に、より多くの球をプロットすることも問題ではなく、特定の位置に配置することも問題ではありません。実際の問題について詳しく説明するほど、助けを受ける可能性は高くなります。それ以外の人は、この質問を「私のために仕事をしてください」と理解しているかもしれません。多くの人がアレルギーを起こしています。 – ImportanceOfBeingErnest

+0

それは私の意図ではありませんでした。私は失敗した投稿を掲示することは、彼らが何をしているのかを知っていた人にとってはまったく時間がかからないような、「見えた」という問題に役立つだろうと思っていませんでした。残念なことに、ml4294の答えがハイライトになるので、この問題はmatplotlibでは解決できません。 –

答えて

2

。これはmatplotlib 3d FAQにも記載されており、推奨はmayaviを使用することです。たぶん、あなたはどこに問題があるのか​​言及したいと思います

from mayavi import mlab 
import numpy as np 

### SURFACE ''' 
x,y = np.meshgrid(np.linspace(-2.5,2), np.linspace(-2,2)) 
f = lambda x,y: .4*np.sin(2*np.pi*x)*np.sin(2*np.pi*y) 
z=f(x,y) 
mlab.surf(x.T,y.T,z.T, colormap="copper") 

### SPHERES ''' 
px,py = np.meshgrid(np.arange(-2,2)+.25, np.arange(-2,2)+.75) 
px,py = px.flatten(),py.flatten() 
pz = np.ones_like(px)*0.05 
r = np.ones_like(px)*.4 
mlab.points3d(px,py,pz,r, color=(0.9,0.05,.3), scale_factor=1) 


mlab.show() 

enter image description here

+0

ありがとう!私はmayaviに慣れていないので、matplotlibの制限について私が今知っていることを考えれば、私はそれを調べなければならないでしょう(私は通常2Dプロットを作るだけです)。これを読んで、マヤビに慣れていない人にとっては、現在、Python <3.6およびqt4としか互換性がないことが判明しました。このソリューションを使用するには、まず適切な環境を設定する必要があります。参照:https://www.scivision.co/mayavi-qt5-create-conda-env-qt4/ –

2

(x =整数+0.25、y =整数+0.75)で、またはあなたのパラメタリゼーションで最小の関数を決定する必要があります。次に、球座標を使用して球をパラメータ化することができます(ここで行われているように:python matplotlib: drawing 3D sphere with circumferences)、球をプロットします。良いニュースは、最小値が正しく判定されていることであると球が作成されることを

1):

は現在、いくつかの良いニュースといくつかの悪いニュースが来ます。下のプロットでは、それらがサーフェスプロットの青い部分の上にあることがわかります(青の部分が実際に最小を示しています)。

2.)悪いニュースは、球が実際に正しくレンダリングされる別の角度を探すのが難しいことです。私はこのむしろ迷惑な行動の解決策を知らないので、あなたが正しい角度を見つけるまで、おそらく周りを遊ばなければならないでしょう。楽しむ! 1は、必然的に他の人の後ろに隠されたオブジェクトの問題に実行されますmatplotlibのを使用して

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

def func(x, y): 
    return np.sin(2*np.pi*x)*np.sin(2*np.pi*y)/3 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
x = y = np.arange(-2.0, 2.0, 0.05) 

# Get the minima of the function. 
minsx1 = np.arange(int(np.amin(x)) + 0.25, int(np.amax(x)) + 0.25 + 1, 1) 
minsy1 = np.arange(int(np.amin(y)) + 0.75, int(np.amax(y)) + 0.75 + 1, 1) 
minsx2 = np.arange(int(np.amin(x)) + 0.75, int(np.amax(x)) + 0.75 + 1, 1) 
minsy2 = np.arange(int(np.amin(y)) + 0.25, int(np.amax(y)) + 0.25 + 1, 1) 

X, Y = np.meshgrid(x, y) 
zs = np.array([func(x,y) for x,y in zip(np.ravel(X), np.ravel(Y))]) 
Z = zs.reshape(X.shape) 

# Color map for better detection of minima (blue) 
ax.plot_surface(X, Y, Z, cmap="viridis") 
ax.set_zlim3d(-1,1) 

# Spherical coordinates 
r = 0.15 
phi = np.linspace(0, 2 * np.pi, 30) 
theta = np.linspace(0, np.pi, 30) 

# Write spherical coordinates in cartesian coordinates. 
x = r * np.outer(np.cos(phi), np.sin(theta)) 
y = r * np.outer(np.sin(phi), np.sin(theta)) 
z = r * np.outer(np.ones(np.size(phi)), np.cos(theta)) 

# Plot the spheres. 
for xp in minsx1: 
    for yp in minsy1: 
     sphere = ax.plot_surface(x+xp, y+yp, z+0.35, color='r') 
for xp in minsx2: 
    for yp in minsy2: 
     sphere = ax.plot_surface(x+xp, y+yp, z+0.35, color='r') 
ax.view_init(elev=90, azim=0) 
plt.savefig('test.png') 
plt.show() 

enter image description here

+0

それはむしろイライラしていますが、ありがとうございます!このhttps://stackoverflow.com/questions/23188561/matplotlib-3d-plot-zorder-issueに基づき、これはmatplotlibの解決不可能な問題であると思われます。私はそこの提案を試して、他のパッケージで遊んでいきます。私はこの質問を誰かが完全に機能する解決策を思いつくことを期待して少し開いたままにしておきます。 –

+1

私はあなたがmatplotlibでこれを解決できないと思うので、おそらく@ImportanceOfBeingErnestの解決策がここに行く方法です。 – ml4294

関連する問題

 関連する問題