2009-03-31 10 views
14

Ich brauche ternary/triangle plots repräsentieren Molfraktionen zu zeichnen (x, y, z) verschiedener Substanzen/Gemische (x + y + z = 1). Jede Auftragung repräsentiert iso-bewertete Substanzen, z.B. Substanzen, die den gleichen Schmelzpunkt haben. Die Plots müssen auf demselben Dreieck mit verschiedenen Farben/Symbolen gezeichnet werden und es wäre schön, wenn ich auch die Punkte verbinden könnte.Library/Werkzeug zum Zeichnen von ternären/Dreieck Plots

Ich habe Matplotlib, R und Gnuplot betrachtet, aber sie scheinen nicht in der Lage zu sein, diese Art von Handlung zu zeichnen. Das 3rd Party ade4 Paket für R scheint in der Lage zu sein, es zu zeichnen, aber ich bin mir nicht sicher, ob ich mehrere Plots auf demselben Dreieck zeichnen kann.

Ich brauche etwas, das unter Linux oder Windows läuft. Ich bin offen für alle Vorschläge, einschließlich Bibliotheken für andere Sprachen, z. Perl, PHP, Ruby, C# und Java.

+0

Es gibt noch ein paar R Optionen als unten aufgeführt; Probiere 'Bibliothek (sos); findFn ("{ternary plot}") ' –

+0

ein R-Paket, das ich gerade geschrieben habe tut, was Sie benötigen (und mehr) es basiert auf ggplot, Website ist www.ggtern.com –

+0

@CristianCiupitu getan –

Antwort

7

R hat ein externes Paket VCD genannt, das tun sollten, was Sie wollen.

Die Dokumentation ist sehr gut (122 Seiten Handbuch verteilt mit dem Paket); Es gibt auch ein Buch mit dem gleichen Namen, Visual Display of Quantitative Informationen, durch den Autor des Pakets (Prof. Michael Friendly). nur nennen ternaryplot() und passieren in einer m x 3-Matrix, d.h., eine Matrix mit drei Spalten

ternäre Plots unter Verwendung VCDs, zu erstellen.

Die Methodensignatur ist sehr einfach; nur ein einziger Parameter (die m × 3 Datenmatrix) ist erforderlich; und alle Schlüsselwortparameter beziehen sich auf die Ästhetik des Plots, mit Ausnahme der Skalierung, die, wenn sie auf 1 gesetzt ist, die Daten spaltenweise normalisiert.

, um Datenpunkte auf dem ternären Plot plotten, werden die Koordinaten für einen gegebenen Punkt werden als Schwerpunkt des Massepunkte berechnet in der jeder Wert Merkmal der Datenmatrix umfasst, ist ein separates Gewicht, damit die Koordinaten ein Punkt V (a, b, c) sind

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

nachstehendes Diagramm zu erzeugen, i einige gefälschten Daten gerade erstellt vier verschiedene chemische Mischungen zu repräsentieren, die jeweils aus unterschiedlichen Fraktionen der drei Substanzen (x, y, z). Ich habe die Eingabe skaliert (also x + y + z = 1), aber die Funktion wird es für Sie tun, wenn Sie einen Wert für ihren 'scale' Parameter übergeben (in der Tat ist der Standardwert 1, was ich glaube, was Ihre Frage ist erfordert). Ich verwendete verschiedene Farben & Symbole, um die vier Datenpunkte zu repräsentieren, aber Sie können auch nur eine einzelne Farbe/Symbol verwenden und jeden Punkt (über das 'id' Argument) beschriften.

http://www.freeimagehosting.net/uploads/35393eaba5.png

+0

Es sieht auf jeden Fall interessant, schade, es hat so viele Abhängigkeiten, die ich nicht auf meiner Fedora 12 Maschine habe :-(Wie auch immer, danke für die Antwort und +1 von mir. –

+1

das ist schade - ich denke, dass Sie genossen haben könnten Englisch: www.mjfriendship.de/en/index.php?op...39&Itemid=32 (Ein Zufall, dass ich, als ich oben meine Antwort tippte, auf dem Weg zurück nach Spanien von einem Kletterausflug in das wunderschöne Fagaras - Gebirge auf dem Flughafen von Bukarest saß.) Ich glaube nicht, dass ich das habe Wenn du zustimmst, füge vielleicht das Tag hinzu, wenn du eine Chance hast. – doug

+0

Ich habe es auf Fedora 12 installiert, indem ich R ausgeführt und an der R-Eingabeaufforderung 'install.packages (c ("vcd")) '. Auch die Beispiele aus der 'ternaryplot'-Manpage funktionierten wie ein Zauber. Nochmals vielen Dank! Was das' r'-Tag angeht, habe ich Ihren Kommentar nicht bemerkt, sonst hätte ich ihn hinzugefügt Ich selbst. PS: Ich bin froh, dass du deinen Kletterausflug genossen hast. –

0

Suchen Sie eine Vektorzeichnungsbibliothek und zeichnen Sie sie von Grund auf neu, wenn Sie keine einfachere Möglichkeit finden, dies zu tun.

+0

Ich habe auch daran gedacht, aber es wäre zu viel (grunzen) Arbeit. Es gibt viele Details, die herausgefunden werden müssen, z.B. die Positionen der Achsenbeschriftungen oder -markierungen. Btw, Phils Lösung zeichnet im Grunde die Handlung von Grund auf neu. –

3

Chloë Lewis entwickelte eine Dreieck-plot allgemeine Klasse, dazu gedacht, die Bodentextur Dreieck mit Python und Matplotlib zu unterstützen. Es ist hier verfügbar http://nature.berkeley.edu/~chlewis/Sourcecode.html https://github.com/chlewissoil/TernaryPlotPy

Chloe Bearbeitung hinzuzufügen: Verschoben es zu einem zuverlässigeren Gastgeber! Außerdem ist es ein öffentliches Repo. Wenn Sie also eine Bibliotheksverwaltung anfordern möchten, können Sie ein Problem hinzufügen. Ich hoffe, es ist nützlich für jemanden.

+0

Schöne Plots und +1 Zu dumm, dass der Code nicht generisch genug ist, um als Bibliothek verwendet zu werden. –

+0

Link sendet 404 :( – oDDsKooL

+0

@chplewis: Danke für Ihre Bearbeitung! –

13

Erstellt ein sehr einfaches Skript zum Erzeugen von ternären (oder mehr) Plots. Keine Gitternetzlinien oder Ticklines, aber diese wären mit den Vektoren im "Basis" -Array nicht zu schwer hinzuzufügen.

enter image description here

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() 
1

entdecken ich nur ein Werkzeug, das wxTernary genannt ternären Plots Python/Matplotlib verwendet zu erzeugen. Es ist verfügbar über http://wxternary.sourceforge.net/ - ich konnte erfolgreich eine ternäre Handlung auf den ersten Versuch erstellen.

+0

Projekt scheint nicht in das Skript in SCM eingecheckt haben :( – oDDsKooL

0

Es gibt ein R-Paket mit dem Namen soiltexture. Es ist auf die Textur der Bodentextur ausgerichtet, kann aber für einige Aspekte angepasst werden.

6

Ein Paket, das ich in R verfasst haben hat nur für CRAN angenommen worden ist, die Homepage ist www.ggtern.com:

Es basiert off ggplot2, die ich verwendet habe, als eine Plattform. Die treibende Kraft für mich war der Wunsch nach Konsistenz in meiner Arbeit, und da ich ggplot2 stark nutze, war die Entwicklung des Pakets eine logische Folge.

Für diejenigen von Ihnen, die ggplot2 verwenden, sollte die Verwendung von ggtern ein Kinderspiel sein, und hier ist ein paar Demonstrationen, was erreicht werden kann.

Feldspar

Produziert mit dem folgenden Code:

# 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") 

Konturdiagramme wird auch für die ternäre Umgebung geflickt worden, und eine Aufnahme einer neuen Geometrie für die Darstellung Konfidenzintervall über die Mahalanobis Entfernung.

Contour

Produziert mit dem folgenden Code:

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") 
Verwandte Themen