建议从这里下载这篇文章对应的.ipynb文件和相关资源。这样你就能在Jupyter中边阅读,边测试文中的代码。
from IPython.display import display, Math
from sympy import *
init_printing()
from sympy import symbols
from sympy.plotting import plot
x = symbols('x')
expr = x*x
plot(expr)
如果不希望看到上面的'<sympy.plotting.plot.Plot at 0x7f6d26fb8780>'字符串, 在plot()
函数的结尾添加';'
plot(expr);
如果要指定作图范围, 传入(变量, 下限, 上限)
形式的tuple。
from sympy import symbols
from sympy.plotting import plot
x = symbols('x')
expr = x**2
expr_range = (x,-1,3)
plot(expr, expr_range);
通过关键词参数Title
,xlabel
,ylabel
指定。 可以使用latex语法。
from sympy import symbols
from sympy.plotting import plot
x = symbols('x')
expr = x**2
expr_range = (x,-2,3)
title = '$y = {}$'.format(latex(expr))
plot(expr, expr_range, title = title, xlabel = 'x', ylabel = 'y');
用关键词参数line_color
指定颜色。
from sympy import symbols
from sympy.plotting import plot
x = symbols('x')
expr = x**2
plot(expr, expr_range, line_color = 'r');
采用plot(expr_1, expr_2, expr_3, range)
的语法。
expr_1 = x
expr_2 = x**2
expr_3 = x**3
plot(expr_1, expr_2, expr_3, (x, -1, 1));
采用下面的语法
plot(
(expr_1,range_1),
(expr_2,range_2),
...
)
expr_1 = x**2
range_1 = (x,-2,2)
expr_2 = x
range_2 = (x,-1,1)
plot(
(expr_1,range_1),
(expr_2,range_2)
);
expr_1 = x**2
range_1 = (x,-2,2)
expr_2 = x
range_2 = (x,-1,1)
p = plot(
(expr_1,range_1),
(expr_2,range_2),
show = False
);
p[0].line_color = 'r'
p[1].line_color = 'b'
p.show()
要增加图例的话,需要额外的两个步骤。
Legend = True
expr_1 = x**2
range_1 = (x,-2,2)
expr_2 = x
range_2 = (x,-1,1)
p = plot(
(expr_1,range_1),
(expr_2,range_2),
show = False,
legend = True
);
p[0].line_color = 'r'
p[1].line_color = 'b'
p[0].label = 'Line 1'
p[1].label = 'Line 2'
p.show()
用plot3d(expr, x_range , y_range)
绘制3D面图。
from sympy import symbols
from sympy.plotting import plot3d
x, y = symbols('x y')
expr = x*y
x_range = (x, -5, 5)
y_range = (y, -5, 5)
plot3d(expr, x_range, y_range);
plot3d(
(x**2 + y**2, (x, -5, 5), (y, -5, 5)),
(x*y, (x, -3, 3), (y, -3, 3))
);
用plot_parametric(expr_x, expr_y, range_u)
绘制一元参数方程。
from sympy import symbols, cos, sin
from sympy.plotting import plot_parametric
u = symbols('u')
expr_x = cos(u)
expr_y = sin(u)
p = plot_parametric(expr_x, expr_y, (u, -5, 5));
显示结果并不是一个正圆。Sympy提供aspect_ratio
参数调整宽高比, 但在Sympy1.0中并未生效。 社区已经在处理这个问题,可能下个版本发行时这个问题就能被解决。
用`plot3d_parametric_line(expr_x, expr_y, expr_z, range_u)
绘制3D参数方程线。
from sympy import symbols, cos, sin
from sympy.plotting import plot3d_parametric_line
u = symbols('u')
expr_x = cos(u)
expr_y = sin(u)
expr_z = u
plot3d_parametric_line(expr_x, expr_y, expr_z, (u, -5, 5));
from sympy import symbols, cos, sin
from sympy.plotting import plot3d_parametric_surface
u, v = symbols('u v')
expr_x = cos(u + v)
expr_y = sin(u-v)
expr_z = u-v
u_range = (u, -5, 5)
v_range = (v, -5, 5)
plot3d_parametric_surface(expr_x, expr_y, expr_z, u_range, v_range);
p1 = plot_implicit(Eq(x**2 + y**2-5))
p2 = plot_implicit(
Eq(x**2 + y**2, 3),
(x, -3, 3),
(y, -3, 3)
)
给plot_implicit()
传入不等式即可。
plot_implicit(y > x**2);
如果要用多个条件共同定义区域,使用And,Or
等逻辑连词。
plot_implicit(And(y > x, y > -x));
plot_implicit(Or(y > x, y > -x));
有时候Sympy没能挑选你想要的变量作为横轴。
plot_implicit(Eq(y - 1));
这时可以通过x_var
指定横轴需要的变量。
plot_implicit(Eq(y - 1),x_var=x);