如何在Matplotlib中为笛卡尔叶形线分段着色并转换参数形式?
笛卡尔叶形线分段着色实现方案
需求说明
需要绘制笛卡尔叶形线$x^3 - 3xy + y^3 = 0$,并为**第二象限、第四象限及叶尖(第一象限闭合区域)**分别设置不同颜色。原使用contour函数仅能绘制单一颜色,无法实现分段着色,需通过参数化方程分段绘制。
参数化推导
笛卡尔叶形线的标准参数化可通过令$y = tx$代入原方程推导:
- 将$y = tx$代入$x^3 + y^3 = 3xy$,得:
$x^3 + t3x3 = 3x(tx)$ - 化简后(排除$x=0$的奇点),得到参数方程:
$$x = \frac{3t}{1 + t^3}, \quad y = \frac{3t^2}{1 + t^3}$$ - 参数$t$的取值对应不同象限区域:
- 第二象限:$t ∈ (-∞, -1)$(此时$x<0, y>0$)
- 叶尖(第一象限闭合区):$t ∈ (0, +∞)$(此时$x>0, y>0$)
- 第四象限:$t ∈ (-1, 0)$(此时$x>0, y<0$)
实现代码
import matplotlib.pyplot as plt import numpy as np # 生成各分段的参数t数组,避开t=-1的奇点 # 第二象限:t从-100到-1.001 t_second = np.linspace(-100, -1.001, 1000) x_second = 3 * t_second / (1 + t_second**3) y_second = 3 * t_second**2 / (1 + t_second**3) # 叶尖(第一象限):t从0.001到100 t_tip = np.linspace(0.001, 100, 1000) x_tip = 3 * t_tip / (1 + t_tip**3) y_tip = 3 * t_tip**2 / (1 + t_tip**3) # 第四象限:t从-0.999到-0.001 t_fourth = np.linspace(-0.999, -0.001, 1000) x_fourth = 3 * t_fourth / (1 + t_fourth**3) y_fourth = 3 * t_fourth**2 / (1 + t_fourth**3) # 分段绘制,设置不同颜色 plt.figure(figsize=(8,8)) plt.plot(x_second, y_second, color='#ff4444', label='第二象限') plt.plot(x_tip, y_tip, color='#00aa00', label='叶尖区域') plt.plot(x_fourth, y_fourth, color='#4444ff', label='第四象限') # 设置坐标轴样式 plt.axhline(0, color='gray', linewidth=0.5) plt.axvline(0, color='gray', linewidth=0.5) plt.xlim(-5, 5) plt.ylim(-5, 5) plt.gca().set_aspect('equal', adjustable='box') plt.legend() plt.title('笛卡尔叶形线(分段着色)') plt.show()
代码说明
- 用
linspace生成足够密集的参数t,确保曲线平滑; - 避开
t=-1的奇点(此时分母为0),避免计算错误; - 每一段曲线使用不同颜色绘制,并添加图例区分;
- 设置坐标轴相等比例,保证叶形线的形状正确显示。
内容的提问来源于stack exchange,提问作者ADS_Fibonacci
相关产品推荐
相关产品推荐

