三元图是一种用于表示三种变量之间关系的可视化工具,常用于化学、材料科学和地质学等领域。它的特点是将三个变量的比例关系在一个等边三角形中展示,使得每个点的位置代表三个变量的相对比例。
1. 结构
- 三个角分别表示三个变量的最大值(通常为100%)。
- 每个点的坐标反映了这三个变量的比例关系。
2. 应用
- 化学配比:显示不同成分在合成反应中的比例。
- 材料科学:分析合金成分对材料性能的影响。
- 地质学:表示土壤成分的比例,如砂、淤泥和粘土。
3. 优点
- 直观展示三者间的相互关系。
- 便于识别特定组合的最佳方案。
4. 限制
- 适用于只有三种变量的情况,复杂性增加时可读性下降。
三元图是深入了解变量间关系的有效工具,能够帮助研究人员和决策者做出更好的分析和选择。
5.代码
#忽略警告
import warnings
warnings.filterwarnings('ignore')
#导入绘图库
import matplotlib.pyplot as plt
from mpltern.datasets import get_dirichlet_pdfs
import pandas as pd#定义alpha参数
alpha = [2,4,8]
#获取Dirichlet分布的概率密度pdf数据
t ,l, r, v = get_dirichlet_pdfs(n= 61,alpha=alpha)
df = pd.DataFrame({'x1':t,'x2':l,'x3':r,'pdf':v})df
#绘制三元图
fig = plt.figure(figsize=(8,6),dpi=1200)
ax = fig.add_subplot(1,1,1, projection='ternary')
#设置颜色映射和阴影
camp = 'Blues'
shading = 'gouraud'
#绘制三元图的颜色图
cs = ax.tricontourf(t,l,r,v,cmap=camp,shading=shading,rasterized=True)
#添加等高线
ax.tricontour(t,l,r,v,colors='k',linewidths=0.5)
ax.set_tlabel('$x_1$', fontsize=12)
ax.set_llabel('$x_2$', fontsize=12)
ax.set_rlabel('$x_3$', fontsize=12)
ax.set_title("${\\mathbf{\\alpha}}$="+ str(alpha), fontsize=12)
cax = ax.inset_axes([1.05, 0.1, 0.05, 0.9], transform=ax.transAxes)
colorbar = fig.colorbar(cs, cax=cax)
colorbar.set_label('PDF', rotation=270,va='baseline')
plt.savefig('三元图.pdf',format='pdf',bbox_inches='tight')
plt.show()
#不同条件下的三元图
fig = plt.figure(figsize=(10.8,8.8),dpi=1200)
fig.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1, wspace=0.5, hspace=0.5)
#定义alpha参数
alphas = [(1.5,1.5,1.5),(5.0,5.0,5.0),(1.0,2.0,2.0),(2.0,4.0,8.0)]#绘制四个不同的三元图
for i,alpha in enumerate(alphas):ax = fig.add_subplot(2,2,i+1, projection='ternary')#获取Dirichlet分布的概率密度pdf数据t ,l, r, v = get_dirichlet_pdfs(n= 61,alpha=alpha)#设置颜色映射和阴影camp = 'Blues'shading = 'gouraud'#绘制三元图的颜色图cs = ax.tricontourf(t,l,r,v,cmap=camp,shading=shading,rasterized=True)#添加等高线ax.tricontour(t,l,r,v,colors='k',linewidths=0.5)#设置坐标轴标签ax.set_tlabel('$x_1$', fontsize=12)ax.set_llabel('$x_2$', fontsize=12)ax.set_rlabel('$x_3$', fontsize=12)#设置标题ax.set_title("${\\mathbf{\\alpha}}$="+ str(alpha), fontsize=12)#添加颜色图的颜色条cax = ax.inset_axes([1.05, 0.1, 0.05, 0.9], transform=ax.transAxes)colorbar = fig.colorbar(cs, cax=cax)colorbar.set_label('PDF', rotation=270,va='baseline')
plt.savefig('不同条件下的三元图.pdf',format='pdf',bbox_inches='tight')
plt.show()