Frage

ich brauche ternäres / Dreieck Plots repräsentieren Molfraktionen ( x , y , z ) von verschiedenen Substanzen / Mischungen ( x + y + z = 1). Jede Parzelle stellt isovalenten Substanzen, z.B. Substanzen, die den gleichen Schmelzpunkt haben. Die Parzellen müssen auf demselben Dreieck mit verschiedenen Farben / Symbolen gezogen werden und es wäre schön, wenn ich auch die Punkte verbinden könnte.

Ich habe bei matplotlib, R und gnuplot aussieht, aber sie scheinen nicht in der Lage sein, diese Art von Handlung zu ziehen. Das 3rd party ade4 Paket für R scheint in der Lage zu sein, sie zu zeichnen, aber ich bin mir nicht sicher, ob ich mehrere Plots auf demselben Dreieck ziehen 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.B. Perl, PHP, Ruby, C # und Java.

War es hilfreich?

Lösung

R hat ein externes Paket namens VCD , die tun sollten, was Sie wollen.

Die Dokumentation ist sehr gut (122-seitiges Handbuch w / das Paket verteilt); gibt es auch mit dem gleichen Namen ein Buch, Visuelle Darstellung von Quantitative Informationen , durch das Paket des Autors (Prof. Michael Freundlich).

ternäre Plots erstellen mit vcd , rufen Sie einfach ternaryplot () und gibt in einer mx 3-Matrix, dh eine Matrix mit drei Säulen.

Die Methodensignatur ist sehr einfach; nur ein einziger Parameter (m x 3 Datenmatrix) erforderlich ist; und alle der Keyword-Parameter beziehen sich auf die Ästhetik des Grundstücks, mit Ausnahme von Skala, die, wenn sie auf 1 gesetzt, normalisiert die Daten spaltenweise.

, um Datenpunkte auf dem ternären Plot plotten, werden die Koordinaten für einen gegebenen Punkt berechnet als Schwerpunkt der Massenpunkte in der jeder Wert Merkmal, das die Datenmatrix ein getrenntes Gewichts , damit die Koordinaten eines Punktes V (a, b, c)

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

Das Diagramm unten zu erzeugen, i nur erstellt einige gefälschten Daten vier verschiedene chemische Mischungen repräsentieren, die jeweils aus unterschiedlichen Fraktionen der drei Substanzen (x, y, z). Ich skaliert den Eingang (also x + y + z = 1), aber die Funktion wird es für Sie tun, wenn Sie in einem Wert für seine ‚Skala‘ Parameter (in der Tat passieren, ist der Standardwert 1, was ich glaube, ist, was Ihre Frage erfordert). Ich habe verschiedene Farben und Symbole, um die vier Datenpunkte darstellen, aber man kann auch nur eine einzige Farbe / Symbol verwenden und jeden Punkt beschriften (über die ‚id‘ Argument).

Andere Tipps

ein sehr einfaches Skript Erstellt zur Erzeugung von ternären (oder mehr) Plots. Keine Gitternetzlinien oder ticklines, aber diese würden nicht zu hart mit den Vektoren in dem „Basis“ Array hinzuzufügen.

eingeben Bild Beschreibung hier

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

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

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

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

Feldspat

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 Mahalanobisabstand .

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

Veusz unterstützt ternäre Plots. Hier ist ein Beispiel aus der Dokumentation rel="nofollow:

Chloë Lewis entwickelt ein Dreieck-Plot allgemeine Klasse bedeutete die Bodentextur Dreieck unterstützen mit Python und Matplotlib. 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 öffentlicher Repo, wenn Sie also beantragen Bibliothek-isierung möchten, können Sie ein Problem hinzufügen könnte. Hoffe, es ist nützlich, um jemanden.

Ich habe gerade entdeckt ein Werkzeug, das Python / Matplotlib verwendet ternäre Plots zu erzeugen genannt wxTernary. Es ist erhältlich über http://wxternary.sourceforge.net/ - ich war in der Lage, erfolgreich eine Ternärdiagramm zu erzeugen beim ersten Versuch.

Es scheint eine Implementierung bei der Arbeit hier zu sein in gnuplot: Ternärdiagramm
(Quelle: ugm.ac.id )

Finden Sie eine Vektor-Zeichen Bibliothek und es von Grund auf neu ziehen, wenn Sie nicht einen einfacheren Weg, es zu tun gibt.

Es gibt ein R-Paket namens soiltexture . Es ist im Bodentextur Dreieck Grundstück gerichtet, kann aber für einige Aspekte angepasst werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top