Python 用于绘制三元/三角形图的库/工具

Python 用于绘制三元/三角形图的库/工具,python,r,plot,gnuplot,Python,R,Plot,Gnuplot,我需要画出各种物质/混合物(x+y+z=1)的摩尔分数(x,y,z)。每个图表示iso值的物质,例如具有相同熔点的物质。这些图需要用不同的颜色/符号绘制在同一个三角形上,如果我也能把这些点连接起来就好了 我已经看过matplotlib、R和gnuplot,但它们似乎无法绘制这种图。R的第三方软件包似乎能够绘制它,但我不确定是否可以在同一个三角形上绘制多个图 我需要在Linux或Windows下运行的东西。我愿意接受任何建议,包括其他语言的库,例如Perl、PHP、Ruby、C#和Java。如果找

我需要画出各种物质/混合物(x+y+z=1)的摩尔分数(x,y,z)。每个图表示iso值的物质,例如具有相同熔点的物质。这些图需要用不同的颜色/符号绘制在同一个三角形上,如果我也能把这些点连接起来就好了

我已经看过matplotlib、R和gnuplot,但它们似乎无法绘制这种图。R的第三方软件包似乎能够绘制它,但我不确定是否可以在同一个三角形上绘制多个图


我需要在Linux或Windows下运行的东西。我愿意接受任何建议,包括其他语言的库,例如Perl、PHP、Ruby、C#和Java。

如果找不到更简单的方法,请找到矢量绘图库,从头开始绘制

在gnuplot中似乎有一个实现在起作用:

(来源:)

R有一个名为的外部包,它可以做你想做的事情

文档非常好(122页手册随包分发);还有一本同名的书,《定量信息的视觉显示》,作者是该书的作者(Michael Friendly教授)

要使用vcd创建三元绘图,只需调用ternaryplot()并传入一个m x 3矩阵,即一个具有三列的矩阵

方法签名非常简单;只需要一个参数(m x 3数据矩阵);所有的关键字参数都与绘图的美观有关,除了比例,当比例设置为1时,会按列标准化数据

为了在三元图上绘制数据点,将给定点的坐标计算为重心点,其中构成数据矩阵的每个特征值是单独的权重,因此点V(a、b、c)的坐标为

为了生成下面的图表,我刚刚创建了一些假数据来表示四种不同的化学混合物,每种混合物由三种物质(x,y,z)的不同部分组成。我对输入进行了缩放(因此x+y+z=1),但如果您为其“scale”参数传入一个值,该函数将为您执行此操作(事实上,默认值为1,我相信这正是您的问题所需要的)。我使用了不同的颜色和符号来表示四个数据点,但您也可以只使用一种颜色/符号并标记每个点(通过'id'参数)

ChloëLewis开发了一个三角形绘图通用类,用于支持土壤纹理三角形 使用Python和Matplotlib。这里有http://nature.berkeley.edu/~chlewis/Sourcecode.html


克洛伊编辑添加:移动到一个更可靠的主机!此外,这是一个公共回购协议,所以如果您想请求库化,您可以添加一个问题。希望对其他人有用。

创建了一个非常基本的脚本,用于生成三元(或更多)绘图。没有网格线或记号线,但是使用“basis”数组中的向量来添加这些不会太难

从pylab导入*
定义三元图(
数据,
#三元图的比例数据(即a+b+c=1)
缩放=真,
#第一个顶点的方向。
起始角=90,
#垂直于顶点定向标签。
旋转标签=真,
#顶点的标签。
标签=(‘一’、‘二’、‘三’),
#如果需要,可以容纳3个以上的尺寸。
边=3,
#标签距顶点的偏移量(距原点距离的百分比)。
标签偏移=0.10,
#绘图的任何matplotlib关键字参数。
边参数={'color':'black','linewidth':2},
#数字的任何matplotlib关键字参数。
fig_args={'figsize':(8,8),'facecolor':'white','edgecolor':'white'},
):
'''
这将创建一个基本的“三元”图(或四元图等)
'''
基=数组(
[
[
cos(2*pi/边+起始角*pi/180),
sin(2*pi/边+起始角*pi/180)
] 
适用于范围内(侧面)
]
)
#如果数据为Nxsides,则newdata为Nx2。
如果缩放:
#为您缩放数据。
newdata=dot((data.T/data.sum(-1)).T,基)
其他:
#假设数据总和已为1。
新数据=点(数据,基础)
图=图(**图参数)
ax=图添加_子批次(111)
对于枚举中的i,l(标签):
如果i>=边:
打破
x=基准[i,0]
y=基准[i,1]
如果旋转U标签:
角度=180*arctan(y/x)/pi+90

如果angle>90和angle我刚刚发现了一个工具,它使用Python/Matplotlib生成三元图,称为wxTernary。它可以通过--我第一次尝试就成功地生成了一个三元图

有一个名为的R包。它针对的是土壤纹理三角形图,但可以针对某些方面进行自定义。

支持三元图。下面是一个例子:

我在R中编写的一个包刚刚被CRAN接受,网页是:

它基于我用作平台的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")

看起来很有趣,但我对最后一个命令有问题。我不得不修改(截断)它。我会进一步调查的。谢谢你。我也想过这个,但那太辛苦了。有许多细节需要解决,例如轴的位置
# 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")