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

如何在Python中自动绘制数据框中的多条线性方程?

Python自动绘制DataFrame中的线性约束方程

需求说明

批量绘制存储在DataFrame中的线性约束方程,方程形式为 λ₁x₁ + λ₂x₂ = b,需区分<=和>=两种约束类型,自动处理参数为0的边界场景。

优化实现代码

以下是修复了原代码注释错误、补充约束区域填充逻辑的实现:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 示例DataFrame,替换为你的实际数据
df = pd.DataFrame([
    {'λ1': 2, 'λ2': 3, 'b': 6, 'Restrições': '<='},
    {'λ1': 0, 'λ2': 2, 'b': 4, 'Restrições': '>='},
    {'λ1': 3, 'λ2': 0, 'b': 3, 'Restrições': '<='},
    {'λ1': 1, 'λ2': -1, 'b': 0, 'Restrições': '>='}
])

plt.figure(figsize=(8, 6))

for _, row in df.iterrows():
    b = row['b']
    λ1 = row['λ1']
    λ2 = row['λ2']
    restricao = row['Restrições']
    
    # 情况1:λ1为0,方程为 λ₂x₂ = b
    if λ1 == 0:
        if λ2 == 0:
            continue  # λ1和λ2都为0时无有效约束
        y_intercept = b / λ2
        # 绘制直线
        plt.axvline(x=0, ymin=0, ymax=y_intercept/10, linestyle='solid', 
                    label=f'0x₁+{λ2}x₂ {restricao} {b}')
        # 填充约束区域
        if restricao == '<=':
            plt.fill_betweenx([0, y_intercept], 0, 10, color='lightblue', alpha=0.3)
        else:
            plt.fill_betweenx([y_intercept, 10], 0, 10, color='lightgreen', alpha=0.3)
    
    # 情况2:λ2为0,方程为 λ₁x₁ = b
    elif λ2 == 0:
        x_intercept = b / λ1
        # 绘制直线
        plt.axhline(y=0, xmin=0, xmax=x_intercept/10, linestyle='solid', 
                    label=f'{λ1}x₁+0x₂ {restricao} {b}')
        # 填充约束区域
        if restricao == '<=':
            plt.fill_between([0, x_intercept], 0, 10, color='lightblue', alpha=0.3)
        else:
            plt.fill_between([x_intercept, 10], 0, 10, color='lightgreen', alpha=0.3)
    
    # 情况3:b为0,方程为 λ₁x₁ + λ₂x₂ = 0(过原点)
    elif b == 0:
        x = np.linspace(0, 10, 100)
        y = (-λ1 / λ2) * x
        plt.plot(x, y, linestyle='solid', label=f'{λ1}x₁+{λ2}x₂ {restricao} 0')
        # 填充约束区域
        if restricao == '<=':
            plt.fill_between(x, 0, y, color='lightblue', alpha=0.3)
        else:
            plt.fill_between(x, y, 10, color='lightgreen', alpha=0.3)
    
    # 情况4:常规场景,λ1、λ2、b均不为0
    else:
        x_intercept = b / λ1
        y_intercept = b / λ2
        # 绘制直线
        plt.plot([x_intercept, 0], [0, y_intercept], linestyle='solid', 
                 label=f'{λ1}x₁+{λ2}x₂ {restricao} {b}')
        # 填充约束区域
        x = np.linspace(0, x_intercept, 100)
        y_line = (-λ1 / λ2) * x + b / λ2
        if restricao == '<=':
            plt.fill_between(x, 0, y_line, color='lightblue', alpha=0.3)
        else:
            plt.fill_between(x, y_line, 10, color='lightgreen', alpha=0.3)

plt.xlabel('x₁')
plt.ylabel('x₂')
plt.title('线性约束方程可视化')
plt.xlim(0, 10)
plt.ylim(0, 10)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid(True)
plt.show()

代码说明

  • 遍历DataFrame逐行提取约束参数,分4种场景处理边界情况,避免报错
  • 新增约束区域填充(浅蓝色对应<=,浅绿色对应>=),直观展示约束范围
  • 优化图表布局,添加坐标轴标签、标题、网格和错位图例,提升可读性

内容的提问来源于stack exchange,提问作者Moisés Rocha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:35:04