2009-03-31 8 views
14

三元/三角形のプロットを描画するためのツール(X + Y + Z = 1)。各プロットは等価物質を表す。同じ融点を有する物質。プロットは、異なる色/記号で同じ三角形に描画する必要があります。また、ドットを接続することもできます。Iは、様々な物質/混合物のモル分率(X</em><em>、<em>Y</em>、<em>Z</em>)を表す<a href="http://en.wikipedia.org/wiki/Ternary_plot" rel="noreferrer">ternary/triangle plots</a>を描画する必要があるライブラリ/

私はmatplotlib、Rとgnuplotを見ましたが、このようなプロットを描くことはできないようです。 Rの第三者ade4パッケージはそれを描くことができるようですが、同じ三角形に複数のプロットを描くことができるかどうかはわかりません。

LinuxやWindowsで動作するものが必要です。他の言語のライブラリ(例: Perl、PHP、Ruby、C#、Javaなどがあります。

+0

。 try 'ライブラリ(sos); findFn( "{ternary plot}") ' –

+0

私が作ったばかりのRパッケージはggplotに基づいています(必要以上に)、ウェブサイトはwww.ggternです。com –

+0

@CristianCiupitu done –

答えて

7

Rは、あなたが望む何をすべきVCDと呼ばれる外部のパッケージを持っています。

ドキュメントは非常に良いです(マニュアルでは122ページのマニュアルを配布しています)。パッケージの著者(Professor Michael Friendly)の同名の数量情報の表示の書籍もあります。ちょうど(ternaryplotを呼び出し、VCDを用いて三元プロットを作成する

と、即ち、X 3行列Mに3列の行列を渡します。

メソッドのシグネチャは非常に簡単です。 1つのパラメータ(m x 3データ行列)のみが必要です。スケールを除いて、すべてのキーワードパラメータはプロットの美学に関連しています.1に設定すると、列ごとにデータが正規化されます。三成分プロット上のデータ点をプロットする

は、与えられた点の座標は、データマトリックスを含む各特徴値は別重量あるた質点の故に座標の重心として算出されます点V(a、b、c)は以下の図を生成するために

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

あり、私は、四つの異なる化学物質の混合物を、3つの物質(X、Yの変化の画分からなるそれぞれを表すために、いくつかの偽のデータを作成しz)。私は入力(x + y + z = 1)をスケーリングしましたが、関数は 'scale'パラメータの値を渡すとそれを行います(実際にはデフォルトは1です。必要)。私は異なる色の&シンボルを使用して4つのデータポイントを表現しましたが、単一の色/シンボルを使用して各ポイントにラベル付けすることもできます( 'id'引数を使用)。

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

+0

これは間違いなく面白そうです。あまりにも多くの依存関係があり、私のFedora 12マシンにはありません:-(とにかく私から答えて+1してくれてありがとう。 –

+1

それはあまりにも悪いです - 私はあなたが楽しんでいるかもしれないと思います(私の答えを入力したとき、豪華なFagaras山の登り旅行からスペインに帰る途中、ブカレストの空港に座っていたことは間違いありません)。あなたのQに 'r'タグを追加するには、同意すれば、おそらくそのタグを追加してください。 – doug

+0

Rを実行し、RプロンプトでタイプしてFedora 12にインストールすることができました 'install.packagesまた、 'ternaryplot'のマニュアルページの例は、魅力的に働いていました。もう一度ありがとうございます!' r'タグに関しては、私はあなたのコメントに気づいていませんでした。 PS:あなたの登山旅行を楽しんでくれてうれしいです。 –

0

簡単な方法が見つからない場合は、ベクターライブラリを見つけて最初から描画します。

+0

私もこれも考えていましたが、あまりにも多くの仕事をするでしょう。考えなければならない多くの詳細があります(例:軸ラベルまたは目盛りの位置。 Btw、Philのソリューションは、基本的に最初からプロットを描画しています。 –

3

クロエルイスPythonとmatplotlibの土壌テクスチャ三角形 をサポートすることを意味三角形プロットの一般的なクラスを開発しました。より信頼性の高いホストに移動:それはここで追加する編集 http://nature.berkeley.edu/~chlewis/Sourcecode.html https://github.com/chlewissoil/TernaryPlotPy

クロエ利用可能です!また、公開リポジトリであるため、ライブラリ化をリクエストしたい場合は、問題を追加できます。それが誰かにとって有益だと思っています。

+0

ニースのプロットと+1コードがライブラリとして使用するのに十分なほど一般的ではないので、 –

+0

リンク送信404 :( – oDDsKooL

+0

@chplewis:編集ありがとう! –

13

は、三元(またはそれ以上)のプロットを生成するための非常に基本的なスクリプトを作成しました。グリッドラインやティックラインはありませんが、 "基底"配列のベクトルを使用して追加するのは難しくありません。

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

私はちょうどwxTernaryと呼ばれる三元プロットを生成するためのPython/matplotlibのを使用してツールを発見しました。 http://wxternary.sourceforge.net/から入手できます。最初の試行で3峰性のプロットを生成することができました。

+0

プロジェクトはSCMのスクリプトでチェックしていないようです – oDDsKooL

0

soiltextureという名前のRパッケージがあります。それは土壌のテクスチャ三角プロットを目的としていますが、いくつかの面でカスタマイズすることができます。

6

私はRで作成したパッケージががちょうど CRANのために受理された、Webページはwww.ggtern.com次のとおりです。

それは、私のように使用しているggplot2を、オフに基づいていますプラットフォーム。私にとっての原動力は自分の仕事に一貫性を持たせたいという要望でした.ggplot2を頻繁に使うので、パッケージの開発は論理的な進歩でした。

ggplot2を使用している人にとっては、ggternの使用は簡単に行えるはずです。ここでは実現可能なことのデモンストレーションがいくつかあります。等高線プロットはまた、三元環境のためにパッチが適用されている

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

、および、信頼区間を表現するための新しいジオメトリを含める:次のコードで生成

Feldspar

マハラノビス距離を介して。次のコードを用いて製造

Contour

下記より少数Rオプションがあり

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") 
関連する問題

 関連する問題