如何使用Python Plotly绘制带连接线的三元图(ternary chart)
带连接线的三元图实现方案
数据预处理说明
你当前构造的数据集不符合三元图的坐标要求:三元图三个轴的坐标值必须满足同一点位的三个坐标和为固定常数(通常归一化到和为1),你提供的样本点三个变量求和均大于1,需要先做行维度的归一化处理。
你提到的scatter_ternary仅支持散点绘制是认知误区:matplotlib 3.4+版本内置的三元投影坐标轴,同时支持plot()方法绘制连接线、scatter()方法绘制散点,不需要额外引入其他专用库即可实现你要的效果。
实现步骤
- 安装依赖(如果未安装matplotlib和pandas)
pip install pandas matplotlib
- 完整可运行代码
import pandas as pd import matplotlib.pyplot as plt # 加载原始示例数据 dummy_data = [ {"var1":0.74, "var2":.60, "var3":.78, "comp":"option1"}, {"var1":0.8, "var2":0.75, "var3":0.72, "comp":"option2"} ] table = pd.DataFrame.from_dict(dummy_data) # 三元坐标归一化:每行三个值除以该行总和,保证a+b+c=1 coord_cols = ["var1", "var2", "var3"] table[coord_cols] = table[coord_cols].div(table[coord_cols].sum(axis=1), axis=0) # 创建三元图画布 fig, ax = plt.subplots( subplot_kw={'projection': 'ternary'}, figsize=(8, 7) ) # 绘制点位连接线 ax.plot( table["var1"], table["var2"], table["var3"], color="#2563eb", linewidth=2, linestyle="-" ) # 绘制散点(参数和你之前用的scatter_ternary完全兼容) ax.scatter( table["var1"], table["var2"], table["var3"], s=90, color="#f97316", zorder=6 ) # 为每个点位添加标签 for _, row in table.iterrows(): ax.text( row["var1"], row["var2"], row["var3"], row["comp"], fontsize=10, ha="left", va="bottom" ) # 配置轴标签与网格 ax.set_tlabel("var1") ax.set_llabel("var2") ax.set_rlabel("var3") ax.grid(True, alpha=0.3) plt.show()
扩展说明
- 如果你需要绘制多组不同类别的连线,只需要按分类字段拆分DataFrame,循环调用
plot()和scatter()即可,每组可单独配置颜色、线型、点样式。 - 如果需要绘制闭合的轮廓线,只需要在连线的坐标序列末尾追加第一个点的坐标,就能实现闭合效果。
- 如果你的数据本身已经满足三个坐标和为固定值,可以跳过归一化步骤直接绘图。
内容的提问来源于stack exchange,提问作者Leonardo Ferreira
相关产品推荐
相关产品推荐

