0
votes

Comment représenter les points de diffusion d'une fonction 3D avec gnuplot

Je voudrais représenter en 3D le résultat de la fonction F (x, y, z) = (x² (Y + Z) + y² (x-z) + z² (-x-y) -21) avec des points de dispersion. Toute conseils Comment faire cela dans Gnuplot est la bienvenue (de -100 à +100 dans chaque direction).

J'essaie de voir l'endroit "0" à x y et z entier. La taille des points serait la valeur renvoyée par la fonction.


0 commentaires

3 Réponses :


0
votes

Valeurs entières [-100: 100] en 3 dimensions est de 8 millions de points. Si vous deviez tirer quoi que ce soit pour chacun de ceux-ci, l'affichage résultant serait rempli à chaque pixel et non utile en tant qu'outil de visualisation. Le codage par taille ou couleur à chaque point ne vous aidera pas. Maintenant, le nombre de points que vous êtes intéressé à trouver peut constituer un petit sous-ensemble manifeste qui peut être visualisé en tant que parcelle de dispersion 3D dans Gnuplot, mais vous devrez sélectionner ces points plutôt que de tout tracer.

L'approche simple serait de boucler Plus de x, y, z pour calculer votre fonction, alors si la valeur est ce que vous voulez (f (x, y, z) == 0?) Écrivez ce triplet [x, Y, Z] dans un fichier. Si le nombre de points trouvés est raisonnable, vous pouvez visualiser dans GNUPLOT avec les commandes ci-dessous. J'utilise des points aléatoires entre [-1: 1] comme exemple. xxx

(pointType 7 est un cercle solide, pointe 0,4 les rend plus petit)

Entrez la description de l'image ici


5 commentaires

Merci pour le conseil. Je devrai repenser mon sujet.


Je vois, je regarde 4D complotant. Stackoverflow.com/Questtions/14995610/... . F (x, y, z), comme fonction de densité, ne doit être représentée par rien lorsque Negativ, point vert lorsque zéro, jaune DOT lorsque> 0 et <100, point bleu clair lorsque> 100 et <1000. gris clair lorsque <100000, rose quand> 100000. Je vais plus me gratter la tête. Les conseils sont plus que les bienvenus. Gnuplot est toujours un bon point de départ.


Trois n'étaient pas une fonction de densité dans votre requête d'origine. Si vous pouvez le recadrer comme une fonction de densité locale, la version de développement de Gnuplot peut peut-être faire ce que vous voulez. Voir Stackoverflow.com/Questtions/53484738/ ...


Merci. Je vois beaucoup de représentation de la fonction "densité" avec matplotlib ou gnuplot: tas de points de coordonnées non régulièrement distribuées et de la même pondération de chaque point. La "densité" que je veux représenter est définie par des points répartis régulièrement X Y Z (tous les entiers), et à ces points, une valeur de densité (différente à 1; voir la fonction F ci-dessus) est définie.


Voir la réponse n ° 2. Représentant que de nombreux points individuellement n'est pas pratique. Vous devrez choisir une autre représentation.



0
votes

réponse n ° 2: à moins que la fonction de densité ne soit nulle dans la plupart des endroits, il remplit un volume solide. Afin de visualiser ce volume, vous devez sélectionner des points spécifiques ou prendre des tranches ou autre chose. Les options raisonnables dépendent de la structure de votre fonction. Gnuplot propose maintenant plusieurs approches. Voir cet exemple d'utilisation de tranches 2D extraites de la démonstration actuelle Voxel.dem . Cette approche est logique pour une fonction de densité lisse, mais probablement pas pour une fonction où les bits intéressants sont des points discrets plutôt que des régions d'espace.

 Entrez la description de l'image ici


0 commentaires

0
votes

 Entrez la description de l'image ici merci. Je vais suivre plus tard. Je viens d'écrire un script qui remplisse une représentation discrète Jusqu'à présent pour moi avec Matplotlib (je n'étais pas aussi familier avec Gnuplot). Aussi: représentant une fonction "f (x, y, z) - a = résultat" à (x, y, z) tout avec des entiers en 3D. Résultat = 0? point de couleur noire. Sinon coloré.

    import matplotlib as mpl
from mpl_toolkits.mplot3d.proj3d import proj_transform
import matplotlib.pyplot as plt
from matplotlib.widgets import Button
import numpy as np

mpl.use('tkagg')

def distance(point, event):
    plt.sca(ax)     # <------------------ introduce this one  !!!!!!!!!!!!!!!!!!!!!!!!!!!
    x2, y2, _ = proj_transform(point[0], point[1], point[2], plt.gca().get_proj())
    x3, y3 = ax.transData.transform((x2, y2))
    return np.sqrt ((x3 - event.x)**2 + (y3 - event.y)**2)

def calcClosestDatapoint(X, event):
    distances = [distance(X[i, 0:3], event) for i in range(Sol)]
    return np.argmin(distances)
#
def annotatePlot(X, index):
    global last_mark, generated_labels
    if activated_labelling:

        x2, y2, _ = proj_transform(X[index, 0], X[index, 1], X[index, 2], ax.get_proj())
        last_mark = plt.annotate(generated_labels[index],
            xy = (x2, y2), xytext = (-20, 20), textcoords = 'offset points', ha = 'right', va = 'bottom',
            bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
            arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))

        fig.canvas.draw()
#
def onMouseMotion(event):
    global Coord
    if activated_labelling:
        closestIndex = calcClosestDatapoint(Coord, event)
        last_mark.remove()
        annotatePlot(Coord, closestIndex)       

def show_on(event):
    global activated_labelling, last_mark,pid,mid

    if activated_labelling == False:
        activated_labelling = True
        x2, y2, _ = proj_transform(Coord[0,0], Coord[0,1], Coord[0,2], ax.get_proj())

        last_mark = plt.annotate("3D measurement on " + generated_labels[0],
                    xy = (x2, y2), xytext = (-20, 20), textcoords = 'offset points', ha = 'right', va = 'bottom',
        bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
        arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))  
        mid = fig.canvas.mpl_connect('motion_notify_event', onMouseMotion)
#
def show_off(event):
    global activated_labelling
    '''
    deactivate the persistent XYZ position labels at the grafic
    '''
    if activated_labelling:
        activated_labelling = False
        last_mark.remove()
        fig.canvas.draw()
        fig.canvas.mpl_disconnect(mid)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
#ax = fig.gca(projection='3d')
activated_labelling = False

Wide = 100
Minimum = -50     
ScanLimit = 3  #  searching between o and 3; 4 and 5 are no solutions
Search = 45

Coord=[]

values=[]

generated_labels = []
#
XMin = 0
XMax = 0
YMin = 0
YMax = 0
ZMin = 0
ZMax = 0

# count the solutions found in the scan area defined above
Sol=0

for i in range(Wide+1):
    for j in range(Wide+1):
        for k in range(Wide+1):

            ########################################################################
            ########################################################################
            ####
            ####                   THIS IS THE POLYNOM TO BE REPRESENTED
            ####
            param_dens = ((i+Minimum)**3)+((j+Minimum)**3)+((k+Minimum)**3) -Search

            if abs(param_dens) <= abs(ScanLimit):
                Coord.append([i+Minimum,j+Minimum,k+Minimum])

                if ScanLimit !=0:
                    values.append([abs(param_dens)])

                labelling = "value {}\nin   X:{}   Y:{}   Z:{}".format(Search+param_dens,i+Minimum,j+Minimum,k+Minimum)    
                generated_labels.append(labelling)
                print(labelling+"\n")

# increase the number indicating the solutions found
                Sol +=1           
# for centering the window          
                if XMin > i+Minimum:
                    XMin = i+Minimum
                if YMin > j+Minimum:
                    YMin = j+Minimum   
                if ZMin > k+Minimum:
                    ZMin = k+Minimum

                if XMax < i+Minimum:
                    XMax = i+Minimum
                if YMax < j+Minimum:
                    YMax = j+Minimum                 
                if ZMax < k+Minimum:
                    ZMax = k+Minimum

print('######################################################')
print('## statistics / move this to a parallel search engine?')
print('## search ')
print("##   total solution %d for searching center %d" % (Sol,Search))    
print("##   from %d to %d" % (Search-ScanLimit,Search+ScanLimit))
print("##   from %d to %d" % (Minimum,Wide+Minimum))      
print('##')      
print('#######################################################')
#
values = np.array(values, dtype='int64')    
Coord = np.array(Coord, dtype='int64')          
#

if ScanLimit !=0:

    cmap = plt.cm.jet  # define the colormap
# extract all colors from the .jet map
    cmaplist = [cmap(i) for i in range(cmap.N)]
# force the first color entry to be black
    cmaplist[0] = (0, 0, 0, 1.0)
# create the new map
    cmap = mpl.colors.LinearSegmentedColormap.from_list('Custom cmap', cmaplist, cmap.N)

# define the bins and normalize
    bounds = np.linspace(0, ScanLimit, ScanLimit+1)
    norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
# create a second axes for the colorbar
    ax2 = fig.add_axes([0.95, 0.1, 0.03, 0.8])
    cb = mpl.colorbar.ColorbarBase(ax2, cmap=cmap, norm=norm,
        spacing='proportional', ticks=bounds, boundaries=bounds, format='%1i')

#    
ax.set_xlim3d(XMin-5, XMax+5)
ax.set_ylim3d(YMin-5, YMax+5)
ax.set_zlim3d(ZMin-5, ZMax+5)
#
ax.set_xlabel('X X')
ax.set_ylabel('Y Y')
ax.set_zlabel('Z Z')

ax.set_aspect(aspect=1)

# extract the scatterplot drawing in a separate function so we ca re-use the code
def draw_scatterplot():
    if ScanLimit !=0:
        ax.scatter3D(Coord[:,0], Coord[:,1], Coord[:,2], s=20, c=values[:,0], cmap=cmap, norm=norm)
    else:
        ax.scatter3D(Coord[:,0], Coord[:,1], Coord[:,2], s=20, c='green')

# draw the initial scatterplot
draw_scatterplot()

# create the "on" button, and place it somewhere on the screen
ax_on = plt.axes([0.0, 0.0, 0.1, 0.05])
button_on = Button(ax_on, 'on')
#
ax_off = plt.axes([0.12, 0.0, 0.1, 0.05])
button_off = Button(ax_off, 'off')
#
#ax_off = plt.axes([0.24, 0.0, 0.1, 0.05])
#button_off = Button(ax_off, 'off')

# link the event handler function to the click event on the button
button_on.on_clicked(show_on)
button_off.on_clicked(show_off)

#fig.colorbar(img)
plt.show()


0 commentaires