مكتبة/أداة للرسم الثلاثي/مثلث المؤامرات [مغلقة]

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

  •  22-08-2019
  •  | 
  •  

سؤال

أنا بحاجة إلى رسم الثلاثي/مثلث المؤامرات تمثل الخلد الكسور (x, y, z) من مختلف المواد/خلائط (x + y + z = 1).كل قطعة تمثل iso-قيمة المواد مثلالمواد التي لها نفس نقطة انصهار.المؤامرات تحتاج إلى أن تكون مرسومة على نفس المثلث مع ألوان مختلفة/رموز و سيكون من الرائع إذا كنت يمكن أيضا ربط النقاط.

لقد بحثت في matplotlib, R gnuplot, ولكن لا يبدو أن تكون قادرة على الاستفادة من هذا النوع من المؤامرة.3rd الطرف ade4 حزمة R يبدو أن تكون قادرة على الاستفادة من ذلك ، ولكن لست متأكدا إذا أنا يمكن رسم مؤامرات متعددة على نفس المثلث.

أنا بحاجة إلى شيء يعمل تحت نظام لينكس أو ويندوز.أنا مستعد لسماع أي اقتراحات ، بما في ذلك المكتبات لغات أخرى ، مثلPerl, PHP, Ruby, C# و Java.

هل كانت مفيدة؟

المحلول

وR لديه حزمة الخارجية دعا VCD التي ينبغي أن تفعل ما تريد.

وثائق جيدة جدا (122 دليل الصفحة توزيع ث / حزمة)؛ هناك أيضا كتاب بنفس الاسم، <م> العرض المرئي للمعلومات الكمية ، بالمؤلف على الحزمة (البروفيسور مايكل ودية).

لخلق المؤامرات الثلاثي باستخدام <القوي> تتكون ، أو مجرد دعوة على ternaryplot () و تمر في مصفوفة م × 3، أي مصفوفة مع ثلاثة الأعمدة.

والتوقيع طريقة بسيطة جدا. فقط معلمة واحدة (المصفوفة م × 3 البيانات) مطلوب. وجميع المعلمات رئيسية تتعلق جماليات المؤامرة، إلا على نطاق و، والتي عندما تعيينها إلى 1، تطبيع البيانات عمود الحكمة.

لرسم نقاط البيانات على مؤامرة ثلاثية، وتحسب إحداثيات نقطة معينة مثل مركز الجاذبية من النقاط جماعية فيه كل قيمة الميزة التي تضم مصفوفة البيانات هي منفصلة <م> الوزن ، وبالتالي إحداثيات نقطة V (أ، ب، ج) هي

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

لتوليد الرسم البياني أدناه، أنا فقط خلق بعض البيانات وهمية لتمثيل أربع خلطات كيميائية مختلفة، تضم كل من كسور متفاوتة من ثلاث مواد (س، ص، ض). I تحجيم الإدخال (بحيث س + ص + ض = 1) ولكن وظيفة تفعل ذلك لأنك إذا كنت تمر في قيمة لها المعلمة "الحجم" (في الواقع، الافتراضي هو 1، والذي أعتقد هو ما سؤالك يتطلب). لقد استخدمت ألوان مختلفة والرموز لتمثيل نقاط البيانات الأربعة، ولكن يمكنك أيضا مجرد استخدام اللون / رمز واحد وتسمية كل نقطة (عبر حجة 'معرف').

نصائح أخرى

ومكون نصي أساسي جدا لتوليد المؤامرات الثلاثي (أو أكثر). لا خطوط الشبكة أو 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 قد فقط تم قبول كران, صفحة ويب www.ggtern.com:

ويستند تشغيله ggplot2, التي استخدمت كمنصة.القوة الدافعة لي رغبة في أن يكون الاتساق في العمل ، ، منذ أن كنت تستخدم ggplot2 بشكل كبير ، تطوير حزمة كان تطور منطقي.

لأولئك منكم الذين يستخدمون ggplot2 استخدام ggtern يجب أن يكون نسيم ، ، وهنا زوجين من المظاهرات ما يمكن تحقيقه.

Feldspar

أنتجت مع التعليمات البرمجية التالية:

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

كفاف قطع كما تم تصحيحها الثلاثي والبيئة ، إدراج هندسة جديدة تمثل فترات الثقة عبر Mahalanobis.

Contour

أنتجت مع التعليمات البرمجية التالية:

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 يدعم المؤامرات الثلاثي. هنا مثال من الوثائق :

وكلو لويس المتقدمة <م> فئة العامة مثلث المؤامرة، وتهدف إلى دعم مثلث قوام التربة مع بيثون وMatplotlib. انها متوفرة هنا <الإضراب> http://nature.berkeley.edu/~chlewis/Sourcecode.html الشبكي : //github.com/chlewissoil/TernaryPlotPy

وكلو تحرير لإضافة: انتقل إلى مجموعة أكثر موثوقية! أيضا، انها الريبو العام، لذلك إذا كنت تريد أن تطلب مكتبة سعودة، يمكنك إضافة قضية. آمل أن يكون مفيدا لشخص ما.

ولقد اكتشفت للتو أداة الذي يستخدم بيثون / Matplotlib لتوليد المؤامرات ثلاثية دعا wxTernary. لأنها متاحة عبر http://wxternary.sourceforge.net/ - وكنت قادرا على توليد بنجاح مؤامرة ثلاثية في المحاولة الأولى.

يبدو أن هناك تنفيذية في العمل هنا في gnuplot:ternary plot
(المصدر: ugm.ac.معرف)

والبحث مكتبة الرسم النواقل واستدراجه من الصفر إذا لم تتمكن من العثور أسهل طريقة للقيام بذلك.

وهناك مجموعة R اسمه soiltexture . إنه يستهدف قوام التربة مثلث المؤامرة، ولكن يمكن أن تكون مخصصة لبعض الجوانب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top