def test_plot_and_save_6(): if not matplotlib: skip("Matplotlib not the default backend") x = Symbol("x") with TemporaryDirectory(prefix="sympy_") as tmpdir: filename = "test.png" ### # Test expressions that can not be translated to np and generate complex # results. ### p = plot(sin(x) + I * cos(x)) p.save(os.path.join(tmpdir, filename)) p = plot(sqrt(sqrt(-x))) p.save(os.path.join(tmpdir, filename)) p = plot(LambertW(x)) p.save(os.path.join(tmpdir, filename)) p = plot(sqrt(LambertW(x))) p.save(os.path.join(tmpdir, filename)) # Characteristic function of a StudentT distribution with nu=10 x1 = 5 * x**2 * exp_polar(-I * pi) / 2 m1 = meijerg(((1 / 2, ), ()), ((5, 0, 1 / 2), ()), x1) x2 = 5 * x**2 * exp_polar(I * pi) / 2 m2 = meijerg(((1 / 2, ), ()), ((5, 0, 1 / 2), ()), x2) expr = (m1 + m2) / (48 * pi) p = plot(expr, (x, 1e-6, 1e-2)) p.save(os.path.join(tmpdir, filename))
def test_set_defaults(): x, y = symbols("x, y") # changing backends should be a smooth operation cfg["backend_2D"] = "bokeh" cfg["backend_3D"] = "matplotlib" set_defaults(cfg) p = plot(sin(x), show=False) assert isinstance(p, BB) p = plot3d(sin(x ** 2 + y ** 2), show=False) assert isinstance(p, MB) # wrong backends settings -> reset to default settings cfg["backend_2D"] = "k3d" raises(ValueError, lambda: set_defaults(cfg)) p = plot(sin(x), show=False) assert isinstance(p, MB) # reset original settings cfg["backend_2D"] = "bokeh" cfg["backend_3D"] = "matplotlib" set_defaults(cfg) reset() from spb.defaults import cfg as cfg2 assert cfg2["backend_2D"] == "matplotlib" assert cfg2["backend_3D"] == "matplotlib"
def test_plot_size(): if not matplotlib: skip("Matplotlib not the default backend") x = Symbol("x") p1 = plot(sin(x), backend=MatplotlibBackend, size=(8, 4)) s1 = p1.fig[0].get_size_inches() assert (s1[0] == 8) and (s1[1] == 4) p2 = plot(sin(x), backend=MatplotlibBackend, size=(5, 10)) s2 = p2.fig[0].get_size_inches() assert (s2[0] == 5) and (s2[1] == 10)
def test_issue_13516(): if not matplotlib: skip("Matplotlib not the default backend") x = Symbol("x") pm = plot(sin(x), backend=MatplotlibBackend, show=False) assert isinstance(pm, MatplotlibBackend) assert len(pm[0].get_data()[0]) >= 30 p = plot(sin(x), show=False) assert isinstance(p, MatplotlibBackend) assert len(p[0].get_data()[0]) >= 30
def test_issue_15265(): if not matplotlib: skip("Matplotlib not the default backend") x = Symbol("x") eqn = sin(x) p = plot(eqn, xlim=(-S.Pi, S.Pi), ylim=(-1, 1)) p.close() p = plot(eqn, xlim=(-1, 1), ylim=(-S.Pi, S.Pi)) p.close() p = plot(eqn, xlim=(-1, 1), ylim=(sympify("-3.14"), sympify("3.14"))) p.close() p = plot(eqn, xlim=(sympify("-3.14"), sympify("3.14")), ylim=(-1, 1)) p.close() raises(ValueError, lambda: plot(eqn, xlim=(-S.ImaginaryUnit, 1), ylim=(-1, 1))) raises(ValueError, lambda: plot(eqn, xlim=(-1, 1), ylim=(-1, S.ImaginaryUnit))) raises(ValueError, lambda: plot(eqn, xlim=(S.NegativeInfinity, 1), ylim=(-1, 1))) raises(ValueError, lambda: plot(eqn, xlim=(-1, 1), ylim=(-1, S.Infinity)))
def test_issue_16572(): if not matplotlib: skip("Matplotlib not the default backend") x = Symbol("x") p = plot(LambertW(x), show=False) # Random number of segments, probably more than 50, but we want to see # that there are segments generated, as opposed to when the bug was present assert len(p[0].get_data()[0]) >= 30
def test_append_issue_7140(): if not matplotlib: skip("Matplotlib not the default backend") x = Symbol("x") p1 = plot(x) p2 = plot(x**2) plot(x + 2) # append a series p2.append(p1[0]) assert len(p2._series) == 2 with raises(TypeError): p1.append(p2) with raises(TypeError): p1.append(p2._series)
def test_issue_11461(): if not matplotlib: skip("Matplotlib not the default backend") x = Symbol("x") p = plot(real_root((log(x / (x - 2))), 3), show=False) # Random number of segments, probably more than 100, but we want to see # that there are segments generated, as opposed to when the bug was present # and that there are no exceptions. assert len(p[0].get_data()[0]) >= 30
def test_issue_17405(): if not matplotlib: skip("Matplotlib not the default backend") x = Symbol("x") f = x**0.3 - 10 * x**3 + x**2 p = plot(f, (x, -10, 10), show=False) # Random number of segments, probably more than 100, but we want to see # that there are segments generated, as opposed to when the bug was present assert len(p[0].get_data()[0]) >= 30
def test_logplot_PR_16796(): if not matplotlib: skip("Matplotlib not the default backend") x = Symbol("x") p = plot(x, (x, 0.001, 100), xscale="log", show=False) # Random number of segments, probably more than 100, but we want to see # that there are segments generated, as opposed to when the bug was present assert len(p[0].get_data()[0]) >= 30 assert p[0].end == 100.0 assert p[0].start == 0.001
def test_plot_and_save_5(): if not matplotlib: skip("Matplotlib not the default backend") x = Symbol("x") y = Symbol("y") with TemporaryDirectory(prefix="sympy_") as tmpdir: s = Sum(1 / x**y, (x, 1, oo)) p = plot(s, (y, 2, 10)) filename = "test_advanced_inf_sum.png" p.save(os.path.join(tmpdir, filename)) p.close() p = plot(Sum(1 / x, (x, 1, y)), (y, 2, 10), show=False) p[0].only_integers = True p[0].steps = True filename = "test_advanced_fin_sum.png" p.save(os.path.join(tmpdir, filename)) p.close()
def test_custom_coloring(): x = Symbol("x") y = Symbol("y") plot(cos(x), line_color=lambda a: a) plot(cos(x), line_color=1) plot(cos(x), line_color="r") plot_parametric(cos(x), sin(x), line_color=lambda a: a) plot_parametric(cos(x), sin(x), line_color=1) plot_parametric(cos(x), sin(x), line_color="r") plot3d_parametric_line(cos(x), sin(x), x, line_color=lambda a: a) plot3d_parametric_line(cos(x), sin(x), x, line_color=1) plot3d_parametric_line(cos(x), sin(x), x, line_color="r") plot3d_parametric_surface( cos(x + y), sin(x - y), x - y, (x, -5, 5), (y, -5, 5), surface_color=lambda a, b: a**2 + b**2, ) plot3d_parametric_surface(cos(x + y), sin(x - y), x - y, (x, -5, 5), (y, -5, 5), surface_color=1) plot3d_parametric_surface(cos(x + y), sin(x - y), x - y, (x, -5, 5), (y, -5, 5), surface_color="r") plot3d(x * y, (x, -5, 5), (y, -5, 5), surface_color=lambda a, b: a**2 + b**2) plot3d(x * y, (x, -5, 5), (y, -5, 5), surface_color=1) plot3d(x * y, (x, -5, 5), (y, -5, 5), surface_color="r")
def test_plot_limits(): if not matplotlib: skip("Matplotlib not the default backend") x = Symbol("x") p = plot(x, x**2, (x, -10, 10)) xmin, xmax = p.ax.get_xlim() assert abs(xmin + 10) < 2 assert abs(xmax - 10) < 2 ymin, ymax = p.ax.get_ylim() assert abs(ymin + 10) < 10 assert abs(ymax - 100) < 10
def test_issue_11865(): if not matplotlib: skip("Matplotlib not the default backend") k = Symbol("k", integer=True) f = Piecewise( (-I * exp(I * pi * k) / k + I * exp(-I * pi * k) / k, Ne(k, 0)), (2 * pi, True)) p = plot(f, show=False) # Random number of segments, probably more than 100, but we want to see # that there are segments generated, as opposed to when the bug was present # and that there are no exceptions. assert len(p[0].get_data()[0]) >= 30
def test_issue_20113(): if not matplotlib: skip("Matplotlib not the default backend") x = Symbol("x") # verify the capability to use custom backends p2 = plot(sin(x), backend=MatplotlibBackend, show=False) assert isinstance(p2, MatplotlibBackend) assert len(p2[0].get_data()[0]) >= 30 p3 = plot(sin(x), backend=DummyBackendOk, show=False) assert isinstance(p3, DummyBackendOk) assert len(p3[0].get_data()[0]) >= 30 # test for an improper coded backend p4 = plot(sin(x), backend=DummyBackendNotOk, show=False) assert isinstance(p4, DummyBackendNotOk) assert len(p4[0].get_data()[0]) >= 30 with raises(NotImplementedError): p4.show() with raises(NotImplementedError): p4.save("test/path") with raises(NotImplementedError): p4.close()
def test_nb_discretization_points(): x = Symbol("x") y = Symbol("y") u = Symbol("u") v = Symbol("v") p = plot(cos(x), n1=50) assert p._series[0].n == 50 p = plot_parametric(cos(u), sin(u), n1=50) assert p._series[0].n == 50 p = plot_parametric(cos(u), sin(u), n=50) assert p._series[0].n == 50 # n has the precedente over n1 p = plot_parametric(cos(u), sin(u), n=50, n1=60) assert p._series[0].n == 50 p = plot3d_parametric_line(cos(u), sin(u), u, n1=50) assert p._series[0].n == 50 p = plot3d_parametric_line(cos(u), sin(u), u, n=50) assert p._series[0].n == 50 # n has the precedente over n1 p = plot3d_parametric_line(cos(u), sin(u), u, n=50, n1=60) assert p._series[0].n == 50 p = plot3d(x + y, n1=40, n2=30) assert p._series[0].n1 == 40 assert p._series[0].n2 == 30 # n has the precedente over n1 and n2 p = plot3d(x + y, n1=40, n2=30, n=20) assert p._series[0].n1 == 20 assert p._series[0].n2 == 20 p = plot_contour(x + y, n1=40, n2=30) assert p._series[0].n1 == 40 assert p._series[0].n2 == 30 # n has the precedente over n1 and n2 p = plot_contour(x + y, n1=40, n2=30, n=20) assert p._series[0].n1 == 20 assert p._series[0].n2 == 20 p = plot3d_parametric_surface(cos(u + v), sin(u - v), u - v, n1=40, n2=30) assert p._series[0].n1 == 40 assert p._series[0].n2 == 30 # n has the precedente over n1 and n2 p = plot3d_parametric_surface(cos(u + v), sin(u - v), u - v, n1=40, n2=30, n=10) assert p._series[0].n1 == 10 assert p._series[0].n2 == 10
def test_plot_and_save_4(): if not matplotlib: skip("Matplotlib not the default backend") x = Symbol("x") y = Symbol("y") ### # Examples from the 'advanced' notebook ### # XXX: This raises the warning "The evaluation of the expression is # problematic. We are trying a failback method that may still work. Please # report this as a bug." It has to use the fallback because using evalf() # is the only way to evaluate the integral. We should perhaps just remove # that warning. with TemporaryDirectory(prefix="sympy_") as tmpdir: with warns(UserWarning, match="The evaluation of the expression is problematic"): i = Integral(log((sin(x)**2 + 1) * sqrt(x**2 + 1)), (x, 0, y)) p = plot(i, (y, 1, 5)) filename = "test_advanced_integral.png" p.save(os.path.join(tmpdir, filename)) p.close()
def test_plot_and_save_3(): if not matplotlib: skip("Matplotlib not the default backend") x = Symbol("x") y = Symbol("y") z = Symbol("z") with TemporaryDirectory(prefix="sympy_") as tmpdir: ### # Examples from the 'colors' notebook ### p = plot(sin(x)) p[0].line_color = lambda a: a filename = "test_colors_line_arity1.png" p.save(os.path.join(tmpdir, filename)) p[0].line_color = lambda a, b: b filename = "test_colors_line_arity2.png" p.save(os.path.join(tmpdir, filename)) p.close() p = plot(x * sin(x), x * cos(x), (x, 0, 10)) p[0].line_color = lambda a: a filename = "test_colors_param_line_arity1.png" p.save(os.path.join(tmpdir, filename)) p[0].line_color = lambda a, b: a filename = "test_colors_param_line_arity1.png" p.save(os.path.join(tmpdir, filename)) p[0].line_color = lambda a, b: b filename = "test_colors_param_line_arity2b.png" p.save(os.path.join(tmpdir, filename)) p.close() p = plot3d_parametric_line( sin(x) + 0.1 * sin(x) * cos(7 * x), cos(x) + 0.1 * cos(x) * cos(7 * x), 0.1 * sin(7 * x), (x, 0, 2 * pi), ) p[0].line_color = lambdify_(x, sin(4 * x)) filename = "test_colors_3d_line_arity1.png" p.save(os.path.join(tmpdir, filename)) p[0].line_color = lambda a, b: b filename = "test_colors_3d_line_arity2.png" p.save(os.path.join(tmpdir, filename)) p[0].line_color = lambda a, b, c: c filename = "test_colors_3d_line_arity3.png" p.save(os.path.join(tmpdir, filename)) p.close() p = plot3d(sin(x) * y, (x, 0, 6 * pi), (y, -5, 5)) p[0].surface_color = lambda a: a filename = "test_colors_surface_arity1.png" p.save(os.path.join(tmpdir, filename)) p[0].surface_color = lambda a, b: b filename = "test_colors_surface_arity2.png" p.save(os.path.join(tmpdir, filename)) p[0].surface_color = lambda a, b, c: c filename = "test_colors_surface_arity3a.png" p.save(os.path.join(tmpdir, filename)) p[0].surface_color = lambdify_((x, y, z), sqrt((x - 3 * pi)**2 + y**2)) filename = "test_colors_surface_arity3b.png" p.save(os.path.join(tmpdir, filename)) p.close() p = plot3d_parametric_surface(x * cos(4 * y), x * sin(4 * y), y, (x, -1, 1), (y, -1, 1)) p[0].surface_color = lambda a: a filename = "test_colors_param_surf_arity1.png" p.save(os.path.join(tmpdir, filename)) p[0].surface_color = lambda a, b: a * b filename = "test_colors_param_surf_arity2.png" p.save(os.path.join(tmpdir, filename)) p[0].surface_color = lambdify_((x, y, z), sqrt(x**2 + y**2 + z**2)) filename = "test_colors_param_surf_arity3.png" p.save(os.path.join(tmpdir, filename)) p.close()
def test_plot_and_save_1(): if not matplotlib: skip("Matplotlib not the default backend") x = Symbol("x") y = Symbol("y") with TemporaryDirectory(prefix="sympy_") as tmpdir: ### # Examples from the 'introduction' notebook ### p = plot(x, legend=True) p = plot(x * sin(x), x * cos(x)) p.extend(p) p[0].line_color = lambda a: a p[1].line_color = "b" p.title = "Big title" p.xlabel = "the x axis" p[1].label = "straight line" p.legend = True p.aspect = (1, 1) p.xlim = (-15, 20) filename = "test_basic_options_and_colors.png" p.save(os.path.join(tmpdir, filename)) p.close() p.extend(plot(x + 1)) p.append(plot(x + 3, x**2)[1]) filename = "test_plot_extend_append.png" p.save(os.path.join(tmpdir, filename)) p[2] = plot(x**2, (x, -2, 3)) filename = "test_plot_setitem.png" p.save(os.path.join(tmpdir, filename)) p.close() p = plot(sin(x), (x, -2 * pi, 4 * pi)) filename = "test_line_explicit.png" p.save(os.path.join(tmpdir, filename)) p.close() p = plot(sin(x)) filename = "test_line_default_range.png" p.save(os.path.join(tmpdir, filename)) p.close() p = plot((x**2, (x, -5, 5)), (x**3, (x, -3, 3))) filename = "test_line_multiple_range.png" p.save(os.path.join(tmpdir, filename)) p.close() raises(ValueError, lambda: plot(x, y)) # Piecewise plots p = plot(Piecewise((1, x > 0), (0, True)), (x, -1, 1)) filename = "test_plot_piecewise.png" p.save(os.path.join(tmpdir, filename)) p.close() p = plot(Piecewise((x, x < 1), (x**2, True)), (x, -3, 3)) filename = "test_plot_piecewise_2.png" p.save(os.path.join(tmpdir, filename)) p.close() # test issue 7471 p1 = plot(x) p2 = plot(3) p1.extend(p2) filename = "test_horizontal_line.png" p.save(os.path.join(tmpdir, filename)) p.close() # test issue 10925 f = Piecewise( (-1, x < -1), (x, And(-1 <= x, x < 0)), (x**2, And(0 <= x, x < 1)), (x**3, x >= 1), ) p = plot(f, (x, -3, 3)) filename = "test_plot_piecewise_3.png" p.save(os.path.join(tmpdir, filename)) p.close()