Bibliothèque / outil pour dessiner des graphiques ternaires / triangle [fermé]
Question
Je l'ai regardé matplotlib, R et gnuplot, mais ils ne semblent pas être en mesure de tirer ce genre de complot. La 3ème partie du package ade4 R semble être en mesure de tirer, mais Je ne sais pas si je peux dessiner plusieurs tracés sur le même triangle.
Je besoin de quelque chose qui fonctionne sous Linux ou Windows. Je suis ouvert à toutes les suggestions, y compris les bibliothèques pour d'autres langues, par exemple Perl, PHP, Ruby, C # et Java.
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 ».
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.
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 .
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.
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.