WIP: Plots
This commit is contained in:
@@ -5,11 +5,13 @@ ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
|
||||
GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a"
|
||||
GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326"
|
||||
IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a"
|
||||
Implicit3DPlotting = "d997a800-832a-4a4c-b340-7dddf3c1ad50"
|
||||
Integrals = "de52edbc-65ea-441a-8357-d3a637375a31"
|
||||
LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f"
|
||||
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
|
||||
Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
|
||||
Meshing = "e6723b4c-ebff-59f1-b4b7-d97aa5274f73"
|
||||
ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78"
|
||||
Mustache = "ffc61752-8dc7-55ee-8c37-f3e9cdd09e70"
|
||||
NonlinearSolve = "8913a72c-1f9b-4ce2-8d82-65094dcecaec"
|
||||
Optimization = "7f7a1694-90dd-40f0-9382-eb1efda571ba"
|
||||
OptimizationOptimJL = "36348300-93cb-4f02-beb5-3c3902f8871e"
|
||||
@@ -19,6 +21,7 @@ PlotlyKaleido = "f2990250-8cf9-495f-b13a-cce12b45703c"
|
||||
PlotlyLight = "ca7969ec-10b3-423e-8d99-40f33abb42bf"
|
||||
Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
|
||||
QuadGK = "1fd47b50-473d-5c70-9696-f719f8f3bcdc"
|
||||
QuizQuestions = "612c44de-1021-4a21-84fb-7261cf5eb2d4"
|
||||
Roots = "f2b01f46-fcfa-551c-844a-d8ac1e96c665"
|
||||
SplitApplyCombine = "03a91e81-4c3e-53e1-a0a4-9c0c8f19dd66"
|
||||
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
|
||||
@@ -26,3 +29,5 @@ SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6"
|
||||
SymbolicLimits = "19f23fe9-fdab-4a78-91af-e7b7767979c3"
|
||||
SymbolicNumericIntegration = "78aadeae-fbc0-11eb-17b6-c7ec0477ba9e"
|
||||
Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
|
||||
Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
|
||||
TextWrap = "b718987f-49a8-5099-9789-dcd902bef87d"
|
||||
|
||||
@@ -250,7 +250,7 @@ With the system defined, we can pass this to `NonlinearProblem`, as was done wit
|
||||
|
||||
|
||||
```{julia}
|
||||
prob = NonlinearProblem(ns, [1.0], [α => 1.0])
|
||||
prob = NonlinearProblem(mtkcompile(ns), [1.0], Dict(α => 1.0))
|
||||
```
|
||||
|
||||
The problem is solved as before:
|
||||
|
||||
@@ -865,20 +865,19 @@ end
|
||||
#### Implicitly defined surfaces, $F(x,y,z)=0$
|
||||
|
||||
|
||||
To plot the equation $F(x,y,z)=0$, for $F$ a scalar-valued function, again the implicit function theorem says that, under conditions, near any solution $(x,y,z)$, $z$ can be represented as a function of $x$ and $y$, so the graph will look likes surfaces stitched together. The `Implicit3DPlotting` package takes an approach like `ImplicitPlots` to represent these surfaces. It replaces the `Contour` package computation with a $3$-dimensional alternative provided through the `Meshing` and `GeometryBasics` packages.
|
||||
To plot the equation $F(x,y,z)=0$, for $F$ a scalar-valued function, again the implicit function theorem says that, under conditions, near any solution $(x,y,z)$, $z$ can be represented as a function of $x$ and $y$, so the graph will look like surfaces stitched together.
|
||||
|
||||
```{julia}
|
||||
using Implicit3DPlotting
|
||||
```
|
||||
With `Makie`, many implicitly defined surfaces can be adequately represented using `countour` with the attribute `levels=[0]`. We will illustrate this technique.
|
||||
|
||||
The `Implicit3DPlotting` package takes an approach like `ImplicitPlots` to represent these surfaces. It replaces the `Contour` package computation with a $3$-dimensional alternative provided through the `Meshing` and `GeometryBasics` packages. This package has a `plot_implicit_surface` function that does something similar to below. We don't illustrate it, as it *currently* doesn't work with the latest version of `Makie`.
|
||||
|
||||
This example, plotting an implicitly defined sphere, comes from the documentation of `Implicit3DPlotting`. The `f` to be plotted is a scalar-valued function of a vector:
|
||||
To begin, we plot a sphere implicitly as a solution to $F(x,y,z) = x^2 + y^2 + z^2 - 1 = 0$>
|
||||
|
||||
|
||||
```{julia}
|
||||
f(x) = sum(x.^2) - 1
|
||||
xlims = ylims = zlims = (-5, 5)
|
||||
plot_implicit_surface(f; xlims, ylims, zlims)
|
||||
f(x,y,z) = x^2 + y^2 + z^2 - 1
|
||||
xs = ys = zs = range(-3/2, 3/2, 100)
|
||||
contour(xs, ys, zs, f; levels=[0])
|
||||
```
|
||||
|
||||
|
||||
@@ -887,11 +886,13 @@ Here we visualize an intersection of a sphere with another figure:
|
||||
|
||||
|
||||
```{julia}
|
||||
r₂(x) = sum(x.^2) - 5/4 # a sphere
|
||||
r₂(x) = sum(x.^2) - 2 # a sphere
|
||||
r₄(x) = sum(x.^4) - 1
|
||||
xlims = ylims = zlims = (-2, 2)
|
||||
p = plot_implicit_surface(r₂; xlims, ylims, zlims, color=:yellow)
|
||||
plot_implicit_surface!(p, r₄; xlims, ylims, zlims, color=:red)
|
||||
ϕ(x,y,z) = (x,y,z)
|
||||
|
||||
xs = ys = zs = range(-2, 2, 100)
|
||||
contour(xs, ys, zs, r₂∘ϕ; levels = [0], colormap=:RdBu)
|
||||
contour!(xs, ys, zs, r₄∘ϕ; levels = [0], colormap=:viridis)
|
||||
current_figure()
|
||||
```
|
||||
|
||||
@@ -900,11 +901,12 @@ This example comes from [Wikipedia](https://en.wikipedia.org/wiki/Implicit_surfa
|
||||
|
||||
```{julia}
|
||||
f(x,y,z) = 2y*(y^2 -3x^2)*(1-z^2) + (x^2 +y^2)^2 - (9z^2-1)*(1-z^2)
|
||||
xlims = ylims = zlims = (-5/2, 5/2)
|
||||
plot_implicit_surface(x -> f(x...); xlims, ylims, zlims)
|
||||
xs = ys = zs = range(-5/2, 5/2, 100)
|
||||
contour(xs, ys, zs, f; levels=[0], colormap=:RdBu)
|
||||
|
||||
```
|
||||
|
||||
(This figure does not render well through `contour(xs, ys, zs, f, levels=[0])`, as the hole is not shown.)
|
||||
(This figure does not render well though, as the hole is not shown.)
|
||||
|
||||
|
||||
For one last example from Wikipedia, we have the Cassini oval which "can be defined as the point set for which the *product* of the distances to $n$ given points is constant." That is:
|
||||
@@ -915,8 +917,8 @@ function cassini(λ, ps = ((1,0,0), (-1, 0, 0)))
|
||||
n = length(ps)
|
||||
x -> prod(norm(x .- p) for p ∈ ps) - λ^n
|
||||
end
|
||||
xlims = ylims = zlims = (-2, 2)
|
||||
plot_implicit_surface(cassini(1.05); xlims, ylims, zlims)
|
||||
xs = ys = zs = range(-2, 2, 100)
|
||||
contour(xs, ys, zs, cassini(0.80) ∘ ϕ; levels=[0], colormap=:RdBu)
|
||||
```
|
||||
|
||||
## Vector fields. Visualizations of $f:R^2 \rightarrow R^2$
|
||||
|
||||
@@ -251,40 +251,7 @@ The `text` mode specification is necessary to have text be displayed on the char
|
||||
#### RGB Colors
|
||||
|
||||
|
||||
The `ColorTypes` package is the standard `Julia` package providing an `RGB` type (among others) for specifying red-green-blue colors. To make this work with `Config` and `JSON3` requires some type-piracy (modifying `Base.string` for the `RGB` type) to get, say, `RGB(0.5, 0.5, 0.5)` to output as `"rgb(0.5, 0.5, 0.5)"`. (RGB values in JavaScript are integers between $0$ and $255$ or floating point values between $0$ and $1$.) A string with this content can be specified. Otherwise, something like the following can be used to avoid the type piracy:
|
||||
|
||||
|
||||
```{julia}
|
||||
struct rgb
|
||||
r
|
||||
g
|
||||
b
|
||||
end
|
||||
PlotlyLight.JSON3.StructTypes.StructType(::Type{rgb}) = PlotlyLight.JSON3.StructTypes.StringType()
|
||||
Base.string(x::rgb) = "rgb($(x.r), $(x.g), $(x.b))"
|
||||
```
|
||||
|
||||
With these defined, red-green-blue values can be used for colors. For example to give a range of colors, we might have:
|
||||
|
||||
|
||||
```{julia}
|
||||
#| hold: true
|
||||
cols = [rgb(i,i,i) for i in range(10, 245, length=5)]
|
||||
sizes = [12, 16, 20, 24, 28]
|
||||
data = Config(x = 1:5,
|
||||
y = rand(5),
|
||||
mode="markers+text",
|
||||
type="scatter",
|
||||
name="scatter plot",
|
||||
text = ["marker $i" for i in 1:5],
|
||||
textposition = "top center",
|
||||
marker = Config(size=sizes, color=cols)
|
||||
)
|
||||
Plot(data)
|
||||
```
|
||||
|
||||
The `opacity` key can be used to control the transparency, with a value between $0$ and $1$.
|
||||
|
||||
The `ColorTypes` package is the standard `Julia` package providing an `RGB` type (among others) for specifying red-green-blue colors. To make this work with `Config` and `JSON3` requires some type-piracy (modifying `Base.string` for the `RGB` type) to get, say, `RGB(0.5, 0.5, 0.5)` to output as `"rgb(0.5, 0.5, 0.5)"`. (RGB values in JavaScript are integers between $0$ and $255$ or floating point values between $0$ and $1$.) A string with this content can be specified.
|
||||
|
||||
#### Marker symbols
|
||||
|
||||
|
||||
@@ -601,14 +601,7 @@ det(N)
|
||||
det(collect(N))
|
||||
```
|
||||
|
||||
Similarly, with `norm`:
|
||||
|
||||
|
||||
```{julia}
|
||||
norm(v)
|
||||
```
|
||||
|
||||
and
|
||||
Similarly, with `norm`, which returns a generator unless collected:
|
||||
|
||||
|
||||
```{julia}
|
||||
|
||||
Reference in New Issue
Block a user