如何在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
相关产品推荐
相关产品推荐

