2017-08-13 18 views
4

NumPy配列にデータファイルがあり、3D画像を表示したいと思います。私が見ることができるどのようにサイズの2次元画像を(100、100)を表示することができる場合、これは、z = 0NumPy-arrayで3D画像をプロットする

import numpy as np 
from matplotlib import pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
X, Y, Z = np.mgrid[-10:10:100j, -10:10:100j, -10:10:100j] 
T = np.sin(X*Y*Z)/(X*Y*Z) 
T=T[:,:,0] 
im = plt.imshow(T, cmap='hot') 
plt.colorbar(im, orientation='vertical') 
plt.show() 

Slice at z = 0

でxy平面にスライスされ、一例を共有してい形状(100,100,100)のデータTの3D画像?

+1

になりますあなたの質問はあると思われますこれに似て:http s://stackoverflow.com/q/7011428/3272066 – Giorgio

+2

@George私はこの質問がはるかに高い品質だと思うし、リンクされた質問に与えられたよりも実質的な回答から利益を得るかもしれない。 – Mast

+0

Nachiはデータを提供しているので、そのデータを視覚化するためのさまざまなアプローチのスクリーンショットを表示するのはすてきです。リンクされた質問には – Eric

答えて

0

私は主な問題は、各点について4つの情報を持っていると思うので、実際には4次元オブジェクトにinteresstedしています。これをプロットすることは常に困難です(不可能かもしれません)。 、私はX、Y、Zが、唯一のもののすべての組み合わせでinteresstedないよどこz = f(x,y)

  • あなたの変更:あなたが質問を変更

    1. :私は、次のソリューションのいずれかを示唆しますあなたは100レベルのzを必要としないが、おそらく5の場合は、あなたがすでに持っているプロットのうちの5つを作成するだけで、プロットの精度が少し向上します。あなたが最初の方法を使用したい場合には

    、その後、いくつかのサブメソッドがあります。

    A.は、2次元の表面f(x,y)=zをプロットし、T B.使用して使用される任意の技術を、それを色付け詳細は、hereを参照してください。

    z=x^2+y^2収率で(私は最善の解決策だと思う)法1.Aによって与えられたプロット: enter image description here

    私はこのプログラムの開発を使用:

    import numpy as np 
    from matplotlib import pyplot as plt 
    from mpl_toolkits.mplot3d import Axes3D 
    import matplotlib as mpl 
    X, Y = np.mgrid[-10:10:100j, -10:10:100j] 
    Z = (X**2+Y**2)/10 #definition of f 
    T = np.sin(X*Y*Z) 
    norm = mpl.colors.Normalize(vmin=np.amin(T), vmax=np.amax(T)) 
    T = mpl.cm.hot(T) #change T to colors 
    fig = plt.figure() 
    ax = fig.gca(projection='3d') 
    surf = ax.plot_surface(X, Y, Z, facecolors=T, linewidth=0, 
         cstride = 1, rstride = 1) 
    plt.show() 
    

    は、第二の方法は次のようになります::コード付き

    enter image description here

    norm = mpl.colors.Normalize(vmin=-1, vmax=1) 
    X, Y= np.mgrid[-10:10:101j, -10:10:101j] 
    fig = plt.figure() 
    ax = fig.gca(projection='3d') 
    for i in np.linspace(-1,1,5): 
        Z = np.zeros(X.shape)+i 
        T = np.sin(X*Y*Z) 
        T = mpl.cm.hot(T) 
        ax.plot_surface(X, Y, Z, facecolors=T, linewidth=0, alpha = 0.5, cstride 
         = 10, rstride = 10) 
    
    plt.show() 
    

    注:X*Y*Zで割るので、私はT = sin(X*Y*Z)に機能を変更あなたは0

  • +0

    がありません。問題は、第4次元の表面をプロットすることではありませんでした。 3Dでのデータの視覚化です。各点のデータは、色で表す必要があります。 contourはレベル曲線の集まりを表すため、等高線プロットであってはなりません。 – Nachi

    0

    に非常に近い2数を分割ように私は私の質問の解決策を持っている、機能のふるまいが悪いなります。 NumPyデータがあれば、それらをTVTK ImageDataに変換して、mlab形式Mayaviの助けを借りて可視化が可能です。コードとその3Dビジュアライゼーションが他のランダムに生成されたデータ

    from numpy import random 
    data = random.random((20, 20, 20)) 
    

    については、次の

    from tvtk.api import tvtk 
    import numpy as np 
    from mayavi import mlab 
    X, Y, Z = np.mgrid[-10:10:100j, -10:10:100j, -10:10:100j] 
    data = np.sin(X*Y*Z)/(X*Y*Z) 
    i = tvtk.ImageData(spacing=(1, 1, 1), origin=(0, 0, 0)) 
    i.point_data.scalars = data.ravel() 
    i.point_data.scalars.name = 'scalars' 
    i.dimensions = data.shape 
    mlab.pipeline.surface(i) 
    mlab.colorbar(orientation='vertical') 
    mlab.show() 
    

    enter image description here

    ある可視化が

    enter image description here

    関連する問題