Était-ce utile?

La solution

R a un paquet externe appelé VCD qui devrait faire ce que vous voulez.

La documentation est très bonne (122 page de manuel distribué w / paquet); il y a aussi un livre du même nom, Affichage visuel d'informations quantitatives , par l'auteur du paquet (Prof. Michael Friendly).

Pour créer des parcelles ternaires en utilisant vcd , il suffit d'appeler ternaryplot () et passer dans un mx 3 matrice, par exemple, une matrice avec trois Colonnes.

La signature de la méthode est très simple; seulement un seul paramètre (m x 3 de la matrice de données) est nécessaire; et tous les paramètres de mots clés se rapportent à l'esthétique de l'intrigue, à l'exception de l'échelle, qui, lorsqu'il est mis à 1, normalise la colonne sage données.

pour tracer les points de données sur la parcelle ternaire, les coordonnées pour un point donné sont calculées à la centre de gravité des points de masse dans lequel chaque valeur de caractéristique comprenant la matrice de données est un distinct poids , où les coordonnées d'un point V (a, b, c) sont

V(b, c/2, c * (3^.5)/2

Pour générer le diagramme ci-dessous, i viens de créer des fausses données pour représenter quatre différents mélanges de produits chimiques, constituées chacune de fractions différentes de trois substances (x, y, z). Je mis à l'échelle de l'entrée (donc x + y + z = 1), mais la fonction faire pour vous si vous passez une valeur pour le paramètre « échelle » (en fait, la valeur par défaut est 1, ce qui je crois est votre question a besoin). J'ai utilisé différentes couleurs et symboles pour représenter les quatre points de données, mais vous pouvez aussi utiliser une seule couleur / symbole et étiqueter chaque point (via l'argument « id »).

Autres conseils

A créé un script très basique pour générer des graphiques ternaires (ou plus). Pas quadrillages ou ticklines, mais ceux qui ne seraient pas trop difficile à ajouter à l'aide des vecteurs dans le tableau « de base ».

entrer image description ici

from pylab import *


def ternaryPlot(
            data,

            # Scale data for ternary plot (i.e. a + b + c = 1)
            scaling=True,

            # Direction of first vertex.
            start_angle=90,

            # Orient labels perpendicular to vertices.
            rotate_labels=True,

            # Labels for vertices.
            labels=('one','two','three'),

            # Can accomodate more than 3 dimensions if desired.
            sides=3,

            # Offset for label from vertex (percent of distance from origin).
            label_offset=0.10,

            # Any matplotlib keyword args for plots.
            edge_args={'color':'black','linewidth':2},

            # Any matplotlib keyword args for figures.
            fig_args = {'figsize':(8,8),'facecolor':'white','edgecolor':'white'},
        ):
    '''
    This will create a basic "ternary" plot (or quaternary, etc.)
    '''
    basis = array(
                    [
                        [
                            cos(2*_*pi/sides + start_angle*pi/180),
                            sin(2*_*pi/sides + start_angle*pi/180)
                        ] 
                        for _ in range(sides)
                    ]
                )

    # If data is Nxsides, newdata is Nx2.
    if scaling:
        # Scales data for you.
        newdata = dot((data.T / data.sum(-1)).T,basis)
    else:
        # Assumes data already sums to 1.
        newdata = dot(data,basis)

    fig = figure(**fig_args)
    ax = fig.add_subplot(111)

    for i,l in enumerate(labels):
        if i >= sides:
            break
        x = basis[i,0]
        y = basis[i,1]
        if rotate_labels:
            angle = 180*arctan(y/x)/pi + 90
            if angle > 90 and angle <= 270:
                angle = mod(angle + 180,360)
        else:
            angle = 0
        ax.text(
                x*(1 + label_offset),
                y*(1 + label_offset),
                l,
                horizontalalignment='center',
                verticalalignment='center',
                rotation=angle
            )

    # Clear normal matplotlib axes graphics.
    ax.set_xticks(())
    ax.set_yticks(())
    ax.set_frame_on(False)

    # Plot border
    ax.plot(
        [basis[_,0] for _ in range(sides) + [0,]],
        [basis[_,1] for _ in range(sides) + [0,]],
        **edge_args
    )

    return newdata,ax


if __name__ == '__main__':
    k = 0.5
    s = 1000

    data = vstack((
        array([k,0,0]) + rand(s,3), 
        array([0,k,0]) + rand(s,3), 
        array([0,0,k]) + rand(s,3)
    ))
    color = array([[1,0,0]]*s + [[0,1,0]]*s + [[0,0,1]]*s)

    newdata,ax = ternaryPlot(data)

    ax.scatter(
        newdata[:,0],
        newdata[:,1],
        s=2,
        alpha=0.5,
        color=color
        )
    show()

Un paquet que je suis l'auteur dans R a juste été acceptée pour CRAN, page Web est www.ggtern .com :

Il est basé sur ggplot2 , que je l'ai utilisé comme une plate-forme. La force motrice pour moi, était le désir d'avoir une cohérence dans mon travail, et, depuis que je l'utilise ggplot2 fortement, le développement de l'ensemble était une progression logique.

Pour ceux d'entre vous qui utilisent ggplot2, l'utilisation de ggtern devrait être un jeu d'enfant, et, voici quelques démonstrations de ce qui peut être atteint.

feldspath

Produit avec le code suivant:

# Load data
data(Feldspar)

# Sort it by decreasing pressure 
# (so small grobs sit on top of large grobs
Feldspar <- Feldspar[with(Feldspar, order(-P.Gpa)), ]

# Build and Render the Plot
ggtern(data = Feldspar, aes(x = An, y = Ab, z = Or)) + 
#the layer
geom_point(aes(fill = T.C, 
               size = P.Gpa, 
               shape = Feldspar)) + 
#scales
scale_shape_manual(values = c(21, 24)) + 
scale_size_continuous(range = c(2.5, 7.5)) + 
scale_fill_gradient(low = "green", high = "red") + 

#theme tweaks
theme_tern_bw()  + 
theme(legend.position      = c(0, 1), 
      legend.justification = c(0, 1), 
      legend.box.just      = "left") + 

#tweak guides
guides(shape= guide_legend(order   =1,
                           override.aes=list(size=5)),
       size = guide_legend(order   =2),
       fill = guide_colourbar(order=3)) +

#labels and title
labs(size = "Pressure/GPa", 
     fill = "Temperature/C") + 
ggtitle("Feldspar - Elkins and Grove 1990")

Contour des parcelles ont également été patché pour l'environnement ternaire, et l'inclusion d'une nouvelle géométrie pour représenter les intervalles de confiance par le Mahalanobis Distance .

Contour

Produit avec le code suivant:

ggtern(data=Feldspar,aes(An,Ab,Or)) +
  geom_confidence(aes(group=Feldspar,
                      fill=..level..,
                      alpha=1-..level..),
                      n=2000,
                  breaks=c(0.01,0.02,0.03,0.04,
                           seq(0.05,0.95,by=0.1),
                           0.99,0.995,0.9995),
                  color=NA,linetype=1) +
  geom_density2d(aes(color=..level..)) + 
  geom_point(fill="white",aes(shape=Feldspar),size=5) +  
  theme_tern_bw() + 
  theme_tern_nogrid() + 
  theme(ternary.options=element_ternary(padding=0.2),
                        legend.position=c(0,1),
                        legend.justification=c(0,1),
                        legend.box.just="left") +
  labs(color="Density",fill="Confidence",
   title="Feldspar - Elkins and Grove 1990 + Confidence Levels + Density") +
  scale_color_gradient(low="gray",high="magenta") +
  scale_fill_gradient2(low="red",mid="orange",high="green",
                       midpoint=0.8) +
  scale_shape_manual(values=c(21,24)) + 
  guides(shape= guide_legend(order   =1,
                             override.aes=list(size=5)),
         size = guide_legend(order   =2),
         fill = guide_colourbar(order=3),
         color= guide_colourbar(order=4),
         alpha= "none")

Veusz prend en charge les parcelles ternaires. Voici un exemple de la :

Lewis Chloë développé un triangle tracé classe générale, destinée à soutenir le triangle de la texture du sol avec Python et Matplotlib. Il est disponible ici http://nature.berkeley.edu/~chlewis/Sourcecode.html https : //github.com/chlewissoil/TernaryPlotPy

édition Chloé ajouter: Déplacé à un hôte plus fiable! En outre, il est une prise en pension publique, donc si vous voulez demander-isation de la bibliothèque, vous pouvez ajouter un problème. Espérons que c'est utile à quelqu'un.

Je viens de découvrir un outil qui utilise Python / Matplotlib pour générer des tracés ternaires appelés wxTernary. Il est disponible via http://wxternary.sourceforge.net/ - j'ai pu générer avec succès un terrain ternaire sur le premier essai.

Il semble y avoir une mise en œuvre au travail ici en gnuplot: complot ternaire
(source: ugm.ac.id )

Trouver une bibliothèque de dessin vectoriel et dessiner à partir de zéro si vous ne pouvez pas trouver un moyen plus facile de le faire.

Il y a un paquet R nommé soiltexture . Il est destiné au tracé triangulaire de la texture du sol, mais peut être personnalisé pour certains aspects.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top