31

この質問はこれに関連しています

私が知りたいのは、提案されたソリューションを一連のデータ(4列)に適用する方法です。例:

0.1 0 0.1 2.0
0.1 0 1.1 -0.498121712998
0.1 0 2.1 -0.49973005075
0.1 0 3.1 -0.499916082038
0.1 0 4.1 -0.499963726586
0.1 1 0.1 -0.0181405895692
0.1 1 1.1 -0.490774988618
0.1 1 2.1 -0.498653742846
0.1 1 3.1 -0.499580747953
0.1 1 4.1 -0.499818696063
0.1 2 0.1 -0.0107079119572
0.1 2 1.1 -0.483641823093
0.1 2 2.1 -0.497582061233
0.1 2 3.1 -0.499245863438
0.1 2 4.1 -0.499673749657
0.1 3 0.1 -0.0075248589089
0.1 3 1.1 -0.476713038166
0.1 3 2.1 -0.49651497615
0.1 3 3.1 -0.498911427589
0.1 3 4.1 -0.499528887295
0.1 4 0.1 -0.00579180003048
0.1 4 1.1 -0.469979974092
0.1 4 2.1 -0.495452458086
0.1 4 3.1 -0.498577439505
0.1 4 4.1 -0.499384108904
1.1 0 0.1 302.0
1.1 0 1.1 -0.272727272727
1.1 0 2.1 -0.467336140806
1.1 0 3.1 -0.489845926622
1.1 0 4.1 -0.495610916847
1.1 1 0.1 -0.000154915998165
1.1 1 1.1 -0.148803329865
1.1 1 2.1 -0.375881358454
1.1 1 3.1 -0.453749548548
1.1 1 4.1 -0.478942841849
1.1 2 0.1 -9.03765566114e-05
1.1 2 1.1 -0.0972702806613
1.1 2 2.1 -0.314291859842
1.1 2 3.1 -0.422606253083
1.1 2 4.1 -0.463359353084
1.1 3 0.1 -6.31234088628e-05
1.1 3 1.1 -0.0720095219203
1.1 3 2.1 -0.270015786897
1.1 3 3.1 -0.395462300716
1.1 3 4.1 -0.44875793248
1.1 4 0.1 -4.84199181874e-05
1.1 4 1.1 -0.0571187054704
1.1 4 2.1 -0.236660992042
1.1 4 3.1 -0.371593983211
1.1 4 4.1 -0.4350485869
2.1 0 0.1 1102.0
2.1 0 1.1 0.328324567994
2.1 0 2.1 -0.380952380952
2.1 0 3.1 -0.462992178846
2.1 0 4.1 -0.48400342421
2.1 1 0.1 -4.25137933034e-05
2.1 1 1.1 -0.0513190921508
2.1 1 2.1 -0.224866151101
2.1 1 3.1 -0.363752470126
2.1 1 4.1 -0.430700436658
2.1 2 0.1 -2.48003822279e-05
2.1 2 1.1 -0.0310025255124
2.1 2 2.1 -0.158022037087
2.1 2 3.1 -0.29944612818
2.1 2 4.1 -0.387965424205
2.1 3 0.1 -1.73211484062e-05
2.1 3 1.1 -0.0220466245862
2.1 3 2.1 -0.12162780064
2.1 3 3.1 -0.254424041889
2.1 3 4.1 -0.35294082311
2.1 4 0.1 -1.32862131387e-05
2.1 4 1.1 -0.0170828002197
2.1 4 2.1 -0.0988138417802
2.1 4 3.1 -0.221154587294
2.1 4 4.1 -0.323713596671
3.1 0 0.1 2402.0
3.1 0 1.1 1.30503380917
3.1 0 2.1 -0.240578771191
3.1 0 3.1 -0.41935483871
3.1 0 4.1 -0.465141248676
3.1 1 0.1 -1.95102493785e-05
3.1 1 1.1 -0.0248114638773
3.1 1 2.1 -0.135153019304
3.1 1 3.1 -0.274125336409
3.1 1 4.1 -0.36965644171
3.1 2 0.1 -1.13811197906e-05
3.1 2 1.1 -0.0147116366819
3.1 2 2.1 -0.0872950700627
3.1 2 3.1 -0.202935925412
3.1 2 4.1 -0.306612285308
3.1 3 0.1 -7.94877050259e-06
3.1 3 1.1 -0.0103624783432
3.1 3 2.1 -0.0642253568271
3.1 3 3.1 -0.160970897235
3.1 3 4.1 -0.261906474418
3.1 4 0.1 -6.09709039262e-06
3.1 4 1.1 -0.00798626913355
3.1 4 2.1 -0.0507564081263
3.1 4 3.1 -0.133349565782
3.1 4 4.1 -0.228563754423
4.1 0 0.1 4202.0
4.1 0 1.1 2.65740045079
4.1 0 2.1 -0.0462153115214
4.1 0 3.1 -0.358933906213
4.1 0 4.1 -0.439024390244
4.1 1 0.1 -1.11538537794e-05
4.1 1 1.1 -0.0144619860317
4.1 1 2.1 -0.0868190343718
4.1 1 3.1 -0.203767982755
4.1 1 4.1 -0.308519215265
4.1 2 0.1 -6.50646078271e-06
4.1 2 1.1 -0.0085156584289
4.1 2 2.1 -0.0538784714494
4.1 2 3.1 -0.140215240068
4.1 2 4.1 -0.23746380125
4.1 3 0.1 -4.54421180079e-06
4.1 3 1.1 -0.00597669061814
4.1 3 2.1 -0.038839789599
4.1 3 3.1 -0.106675396816
4.1 3 4.1 -0.192922262523
4.1 4 0.1 -3.48562423225e-06
4.1 4 1.1 -0.00459693165308
4.1 4 2.1 -0.0303305231375
4.1 4 3.1 -0.0860368842133
4.1 4 4.1 -0.162420599686

最初の問題の解決策は次のとおりです。

# Python-matplotlib Commands
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-5, 5, .25)
Y = np.arange(-5, 5, .25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
Gx, Gy = np.gradient(Z) # gradients with respect to x and y
G = (Gx**2+Gy**2)**.5  # gradient magnitude
N = G/G.max()  # normalize 0..1
surf = ax.plot_surface(
    X, Y, Z, rstride=1, cstride=1,
    facecolors=cm.jet(N),
    linewidth=0, antialiased=False, shade=False)
plt.show()

私が見る限り、これはすべてのmatplotlib-demosに当てはまりますが、変数X、Y、Zはうまく準備されています。実際には、これが常に当てはまるとは限りません。

与えられたソリューションを任意のデータで再利用する方法を考えますか?

4

5 に答える 5

57

Tengis さん、すばらしい質問です。すべての数学関係者は、与えられた関数を使用して派手な表面プロットを見せびらかすのが大好きですが、現実世界のデータを扱うことは避けています。変数の関係は関数を使用してモデル化されているため、提供したサンプル コードでは勾配を使用しています。この例では、標準正規分布を使用してランダム データを生成します。

とにかく、最初の 3 つの変数が軸上にあり、4 番目の変数が色である 4D ランダム (任意) データをすばやくプロットする方法は次のとおりです。

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

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = np.random.standard_normal(100)
y = np.random.standard_normal(100)
z = np.random.standard_normal(100)
c = np.random.standard_normal(100)

img = ax.scatter(x, y, z, c=c, cmap=plt.hot())
fig.colorbar(img)
plt.show()

注: 4 次元には、ホット カラー スキーム (黄色から赤) のヒートマップが使用されました。

結果:

] 1

于 2015-07-22T23:21:46.013 に答える
0

1つの可能性は、RGBAやHSVAなどの色空間を使用することです。これらは4次元ですが、アルファ(透明度)を適切に表示することが問題になる場合があります。

他の可能性は、スライダーを使用した動的プロットです。ディメンションの1つは、スライダーで表されます。

しかし、それがあなたが求めているものであるかどうかはわかりません。

于 2013-02-23T06:37:14.210 に答える
0

I also wanted to add my twocents!

I created a program for this a while back for a multivariable calculus course I was teaching and figured I would include it here.

My approach is similar to others that have posted (using a scatterplot), however, I made some changes to really make the graphics pop.

Specifically, I included a function to remove a portion of the Alpha channel range to make portions of the range transparent. This is controlled by the function f_AlphaControl in the code below.

The function I used in the demo is the function f(x,y,z)=xyz*exp(-x^2-y^2-z^2). It has 4 local max and 4 local min, all of which are visualized in the plots below. I think the results speak for themselves so please take a look at them and let me know what you think .

2700 points: epsilon=2 , epsilon=1 , epsilon=.5 , epsilon=.1 , epsilon=5Andx0=-1

1000000 points: epsilon=5 , epsilon=1

This code allows for creation of isovolume plots that rival Mayavi-VTK and/or OpenGL but without all of the effort. I have similar routines coded up in Mayavi, however, since OP just asked about matplotlib, I wanted to show how powerful it can be.


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

from matplotlib.colors import ListedColormap

## The following code creates the figure plotting function
def MakePlot(xx,yy,zz,ww,cmapO=cm.jet): 
    ##Create Custom Colormap with Alpha varying depending on the functions behavior. 
    ## This produces very nice isovolume plots similar to Mayavi and OpenCV
    
    ##Preallocate new colormap
    my_cmapN=cmapO(np.arange(cmapO.N))
    
    #set Alpha of new colormap to be small in the middle of the colormap range using a bump function
    # this can be changed to emphasize different areas of the range that are of interest.   
    nA=cmapO.N    
    xA=np.linspace(-1,1,nA)
    epsilon=1.5 #Width of range to exclude from alpha channel
    x_0=0#Center of range to exclude from alpha channel
    
    def f_AlphaControl(x):
        u=(x-x_0)/epsilon
        return 1-np.exp(-u**2/(1-u**2))*(np.abs(u)<1.)

    yA=f_AlphaControl(xA) 
    plt.plot(xA,f_AlphaControl(xA))
    plt.xlim([-1,1])
    plt.ylim([0,1])
   
    my_cmapN[:,-1]=yA
    
    fig = plt.figure(dpi=200) 
    
    # Create new colormap
    my_cmap = ListedColormap(my_cmapN) 
    
    
    plt.style.use('dark_background')
    fig = plt.figure(dpi=200) 
    ax = fig.add_subplot(projection='3d')
    points=ax.scatter(xx,yy,zz,c=ww,cmap=my_cmap)   
    cbar=fig.colorbar(points)
    # cbar.solids.set_rasterized(True)
    
    cbar.set_alpha(1)
    cbar.draw_all()
    
    ## Make Title for plot
    ax.set_title(r'Plot of $f:\mathbb{R}^3\rightarrow \mathbb{R}$'+'\n'+r'$w=f(x,y,z)$')
      
    ##Plot x, y, and z axis useful for visual referencing when viewing the plot
    eps=.3
    tt=np.linspace(-(1+eps)*L,(1+eps)*L,2)
    ax.plot(tt,0*tt,0*tt,c='magenta',linewidth=2);
    ax.plot(0*tt,tt,0*tt,c='magenta',linewidth=2);
    ax.plot(0*tt,0*tt,tt,c='magenta',linewidth=2)
      
    ## Set viewing angle
    xang=-76;pang=12;
    ax.view_init(pang, xang)
    
    # Set axis limits
    ax.set_xlim([-(1+eps)*L,(1+eps)*L]);ax.set_ylim([-(1+eps)*L,(1+eps)*L]);ax.set_zlim([-(1+eps)*L,(1+eps)*L]);
       
    #Set axis labels
    ax.set_xlabel('$x$');ax.set_ylabel('$y$');ax.set_zlabel('$z$')
    plt.savefig("ScatterPlotVaryingAlpha.png",dpi=200)

if __name__ == "__main__":

    #Set Plot Grid 
    
    L=1.5
    x_C=0.0;y_C=0.0;z_C=0.0;
    # Set XYZ Plotting Grid
    a1=x_C-L;b1=x_C+L;
    a2=y_C-L;b2=y_C+L;
    a3=z_C-L;b3=z_C+L;
    
    n=30;
    NT=n**3
    
    
    
    ##The following if statement determines whether you want to use a random grid R=1 
    ## or a uniform grid R=0
    
    grid_flag=1
    
    if grid_flag==1:
       ## Random Grid
       xx=np.random.uniform(a1,b1,NT);
       yy=np.random.uniform(a2,b2,NT);
       zz=np.random.uniform(a3,b3,NT)
    else:
        ## Even Grid
        x = np.linspace(a1,b1,n);
        y = np.linspace(a2,b2,n);
        z = np.linspace(a3,b3,n);
    
        X, Y, Z = np.meshgrid(x, y, z, indexing='ij', sparse=False)
        
        xx=X.reshape(X.size);yy=Y.reshape(Y.size);zz=Z.reshape(Z.size);
    
    
    
    ## The following code defines the function of 3 variables that we wish to visualize
    ## This can be replaced with the flattened data array that you wish to plot
    
    def f(x,y,z):
        return x*y*z*np.exp(-(x**2+y**2+z**2))
    
    ww=f(xx,yy,zz)
    ww[np.isinf(ww)]=np.nan
    
  
    MakePlot(xx,yy,zz,ww)
    plt.show()




于 2021-11-13T23:45:03.880 に答える