三値/三角プロットを描画するためのライブラリ/ツール [終了]

StackOverflow https://stackoverflow.com/questions/701429

  •  22-08-2019
  •  | 
  •  

質問

絵を描く必要がある 三値/三角プロット モル分率を表す(バツ, y, z) さまざまな物質/混合物 (バツ + y + z = 1)。各プロットは等価物質を表します。同じ融点を持つ物質。プロットは、異なる色/記号を使用して同じ三角形上に描画する必要があり、ドットを接続することもできれば便利です。

matplotlib、R、gnuplot を調べましたが、この種のプロットは描画できないようです。サードパーティ ade4 Rのパッケージでは描画できるようですが、同じ三角形上に複数のプロットを描画できるかどうかはわかりません。

Linux または Windows で動作するものが必要です。他の言語のライブラリを含め、あらゆる提案を歓迎します。Perl、PHP、Ruby、C#、Java。

役に立ちましたか?

解決

R には、という外部パッケージがあります。 VCD これはあなたが望むことをするはずです。

ドキュメントは非常に充実しています (122 ページのマニュアルがパッケージに同梱されています)。同名の本もありますが、 定量的情報の視覚的表示, 、パッケージの作成者 (Prof.マイケルフレンドリー)。

を使用して三値プロットを作成するには ビデオCD, 、電話してください ターナリプロット() そして、m x 3 行列、つまり 3 列の行列を渡します。

メソッドのシグネチャは非常に単純です。単一のパラメータ (m x 3 データ行列) のみが必要です。また、1 に設定するとデータを列方向に正規化するスケールを除き、すべてのキーワード パラメータはプロットの美学に関連します。

三値プロット上にデータ点をプロットするには、指定された点の座標が次のように計算されます。 重心点 データ行列を構成する各特徴値は個別です。 重さ, したがって、点 V(a, b, c) の座標は次のようになります。

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

以下の図を生成するために、それぞれ 3 つの物質 (x、y、z) のさまざまな割合で構成される 4 つの異なる化学混合物を表す偽のデータを作成しました。入力をスケーリングしました(つまり、x + y + z = 1)が、「scale」パラメーターの値を渡すと、関数がそれを行います(実際、デフォルトは1です。これがあなたの質問であると思います)必要)。4 つのデータ ポイントを表すために異なる色と記号を使用しましたが、単一の色/記号を使用して各ポイントにラベルを付けることもできます (「id」引数を使用)。

他のヒント

三元(またはそれ以上)のプロットを生成するための非常に基本的なスクリプトを作成しました。グリッド線ないかticklinesが、それらは「基礎」配列のベクターを使用して追加するにはあまりにも難しいことではないでしょう。

いいえ

ここに画像の説明を入力します

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

私は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")
<時間>

輪郭プロットものマハラノビス距離のを経由して信頼区間を表現するための新しいジオメトリを含めること、三元環境にパッチを適用し、されています。

輪郭

次のコードを用いて生成

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 の三元プロットをサポートしています。 ドキュメントでの例です。// i.stack.imgur.com/Tzsv5.png」ALT = "例プロット">

クロエ・ルイスは、の土壌テクスチャの三角形をサポートすることを意図三角形プロットの一般クラス、の開発しました Pythonとmatplotlibのを持ちます。それはここで利用可能です。<ストライキ> http://nature.berkeley.edu/~chlewis/Sourcecode.html HTTPS ://github.com/chlewissoil/TernaryPlotPyする

クロエ編集追加する:より信頼性の高いホストにそれを移動します!また、それは公共のレポですので、あなたはライブラリ化を要求したい場合は、問題を追加することができます。それは誰かに便利です願っています。

私はちょうどwxTernaryと呼ばれる三元プロットを生成するためのPython / matplotlibのを使用してツールを発見しました。私は成功した三元プロットを生成することができた - それは http://wxternary.sourceforge.net/ を経由して利用可能です最初の試みで。

<ここでの仕事の実装があるようです/ A> gnuplotの中: 三元プロット
<サブ>(ソース: ugm.ac.id

ベクトル描画ライブラリを検索し、あなたがそれを行うための簡単な方法を見つけることができない場合は、最初からそれを描きます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top