You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现交互式耦合绘图(二元相图)的可用库及指引

Python实现交互式二元相图方案

Python完全可以实现你需求的交互式二元相图,以下是两种常用方案及方向指引:

一、Plotly(推荐,原生交互支持)

Plotly是专注于交互式可视化的库,能轻松实现子图联动,代码简洁且支持离线/在线展示。

实现方向:

  1. 布局搭建:用plotly.subplots.make_subplots创建上下两个子图,共享x轴(成分x),底部绘制x-y1(成分-温度)曲线,顶部初始绘制某一温度下的x-y2(成分-吉布斯自由能)曲线。
  2. 数据预处理:将已计算好的数组按温度(y1)分组,构建温度: (x数组, y2数组)的映射字典,方便快速筛选数据。
  3. 交互绑定:给底部曲线绑定鼠标悬停事件,当鼠标移动时获取当前点的温度值,从映射字典中取出对应x和y2数据,用fig.update_traces()更新顶部曲线的内容。

核心代码框架:

import plotly.graph_objects as go
from plotly.subplots import make_subplots
import numpy as np

# 替换为你的实际数据数组
x = np.linspace(0, 1, 100)
y1 = np.linspace(300, 1000, 100)
# 按温度分组存储x和y2数据
temp_data_map = {}
for temp in np.unique(y1):
    mask = y1 == temp
    # 替换为你的y2计算逻辑
    y2 = -temp * x[mask] + 0.5 * temp * x[mask]**2
    temp_data_map[temp] = (x[mask], y2)

# 创建上下子图
fig = make_subplots(rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.1)

# 添加底部成分-温度曲线
fig.add_trace(go.Scatter(x=x, y=y1, mode='lines', name='成分-温度'), row=2, col=1)

# 添加初始顶部曲线
init_temp = next(iter(temp_data_map.keys()))
init_x, init_y2 = temp_data_map[init_temp]
fig.add_trace(go.Scatter(x=init_x, y=init_y2, mode='lines', name=f'G(T={init_temp:.2f})'), row=1, col=1)

# 定义悬停更新函数
def update_top_curve(trace, points, selector):
    if points.point_inds:
        current_temp = y1[points.point_inds[0]]
        curr_x, curr_y2 = temp_data_map[current_temp]
        fig.update_traces(x=curr_x, y=curr_y2, name=f'G(T={current_temp:.2f})', row=1, col=1)

# 绑定事件到底部曲线
fig.data[0].on_hover(update_top_curve)

# 布局配置
fig.update_layout(height=600, width=800, title="二元相图")
fig.update_xaxes(title_text="成分x", row=2, col=1)
fig.update_yaxes(title_text="温度y1", row=2, col=1)
fig.update_yaxes(title_text="吉布斯自由能y2", row=1, col=1)

fig.show()

二、Matplotlib + mplcursors(适合Matplotlib用户)

如果你更习惯Matplotlib的绘图风格,可以搭配mplcursors库实现交互联动。

实现方向:

  1. 子图创建:用plt.subplots(2,1)生成上下子图,底部绘制x-y1曲线,顶部绘制初始x-y2曲线。
  2. 数据分组:同样按温度分组存储x和y2数据,方便快速调用。
  3. 交互回调:用mplcursors监听底部曲线的悬停事件,获取当前温度后更新顶部曲线的data,并重新渲染子图。

核心代码框架:

import matplotlib.pyplot as plt
import mplcursors
import numpy as np

# 替换为你的实际数据
x = np.linspace(0, 1, 100)
y1 = np.linspace(300, 1000, 100)
temp_data_map = {}
for temp in np.unique(y1):
    mask = y1 == temp
    # 替换为你的y2计算逻辑
    y2 = -temp * x[mask] + 0.5 * temp * x[mask]**2
    temp_data_map[temp] = (x[mask], y2)

# 创建子图
fig, (ax_top, ax_bottom) = plt.subplots(2, 1, figsize=(8, 6), sharex=True)
fig.subplots_adjust(hspace=0.15)

# 绘制底部曲线
line_bottom, = ax_bottom.plot(x, y1, 'b-', label='成分-温度')
ax_bottom.set_ylabel('温度y1')
ax_bottom.legend()

# 绘制初始顶部曲线
init_temp = y1[0]
init_x, init_y2 = temp_data_map[init_temp]
line_top, = ax_top.plot(init_x, init_y2, 'r-', label=f'G(T={init_temp:.2f})')
ax_top.set_ylabel('吉布斯自由能y2')
ax_top.legend()

# 悬停更新函数
def on_hover(sel):
    current_temp = sel.target[1]
    curr_x, curr_y2 = temp_data_map[current_temp]
    line_top.set_data(curr_x, curr_y2)
    line_top.set_label(f'G(T={current_temp:.2f})')
    ax_top.legend()
    ax_top.relim()
    ax_top.autoscale_view()
    fig.canvas.draw_idle()

# 绑定交互事件
mplcursors.cursor(line_bottom).connect("add", on_hover)

plt.xlabel('成分x')
plt.show()

其他备选工具

如果Python方案不满足需求,可考虑:

  • OriginPro:专业科学绘图软件,可视化操作即可实现联动相图,适合非编程用户。
  • MATLAB:通过subplot结合WindowButtonMotionFcn事件处理实现子图联动,适合熟悉MATLAB的用户。

内容的提问来源于stack exchange,提问作者nimmi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:03:18