Julia 编程 - 使用图形
本章讨论如何使用 Julia 中的各种工具对数据进行绘图、可视化和执行其他(图形)操作。
使用 Cairo 绘制文本
Cairo 是一个 2D 图形库,为显示系统实现了设备上下文。 它适用于 Linux、Windows、OS X,还可以创建 PDF、PostScript 和 SVG 格式的磁盘文件。 Cairo 的 Julia 文件,即 Cairo.jl 对其 C API 来说是真实的。
示例
以下是画线的例子 −
首先,我们将创建一个 cr 上下文。
julia> using Cairo julia> img = CairoRGBSurface(512, 128); julia> img = CairoRGBSurface(512, 128); julia> cr = CairoContext(img); julia> save(cr);
现在,我们将添加一个矩形 −
julia> set_source_rgb(cr, 0.5, 0.5, 0.5); julia> rectangle(cr, 0.0, 0.0, 512.0, 128.0); julia> fill(cr); julia> restore(cr); julia> save(cr);
现在,我们将定义点并通过这些点绘制一条线 −
julia> x0=61.2; y0=74.0; julia> x1=214.8; y1=125.4; julia> x2=317.2; y2=22.8; julia> x3=470.8; y3=74.0; julia> move_to(cr, x0, y0); julia> curve_to(cr, x1, y1, x2, y2, x3, y3); julia> set_line_width(cr, 10.0); julia> stroke_preserve(cr); julia> restore(cr);
最后,将生成的图形写入磁盘 −
julia> move_to(cr, 12.0, 12.0); julia> set_source_rgb(cr, 0, 0, 0); julia> show_text(cr,"Line_Figure") julia> write_to_png(c,"Line_Figure.png");
输出
使用 Winston 绘制文本
Winston 也是一个 2D 图形库。 它类似于 MATLAB 中可用的内置图形。
示例
julia> x = range(0, stop=3pi, length=100); julia> c = cos.(x); julia> s = sin.(x); julia> p = FramedPlot( title="Winston Graphics!", xlabel="\\Sigma x^2_i", ylabel="\\Theta_i") julia> add(p, FillBetween(x, c, x, s)) julia> add(p, Curve(x, c, color="black")) julia> add(p, Curve(x, s, color="red"))
输出
数据可视化
数据可视化可以定义为以各种图形和图片格式(例如饼图和条形图)呈现数据。
Gadfly
Gadfly 是一个强大的 Julia 数据可视化包,也是"图形语法"风格的实现。 它基于与 R 中的 ggplot2 相同的原理。要使用它,我们需要首先在 Julia 包管理器的帮助下添加它。
示例
要使用Gadfly,我们首先需要使用RDatasets包,以便我们可以获得一些数据集来使用。 在此示例中,我们将使用 iris 数据集 −
julia> using Gadfly julia> using RDatasets julia> iris = dataset("datasets", "iris"); julia> first(iris,10) 10×5 DataFrame │ Row │ SepalLength │ SepalWidth │ PetalLength │ PetalWidth │ Species │ │ │ Float64 │ Float64 │ Float64 │ Float64 │ Cat… │ ├─────┼─────────────┼────────────┼─────────────┼────────────┼─────────┤ │ 1 │ 5.1 │ 3.5 │ 1.4 │ 0.2 │ setosa │ │ 2 │ 4.9 │ 3.0 │ 1.4 │ 0.2 │ setosa │ │ 3 │ 4.7 │ 3.2 │ 1.3 │ 0.2 │ setosa │ │ 4 │ 4.6 │ 3.1 │ 1.5 │ 0.2 │ setosa │ │ 5 │ 5.0 │ 3.6 │ 1.4 │ 0.2 │ setosa │ │ 6 │ 5.4 │ 3.9 │ 1.7 │ 0.4 │ setosa │ │ 7 │ 4.6 │ 3.4 │ 1.4 │ 0.3 │ setosa │ │ 8 │ 5.0 │ 3.4 │ 1.5 │ 0.2 │ setosa │ │ 9 │ 4.4 │ 2.9 │ 1.4 │ 0.2 │ setosa │ │ 10 │ 4.9 │ 3.1 │ 1.5 │ 0.1 │ setosa │
现在让我们绘制散点图。 我们将使用变量 SepalLength 和 SepalWidth。 为此,我们需要使用 Geom.point 设置几何元素,如下所示 −
julia> Gadfly.plot(iris, x = :SepalLength, y = :SepalWidth, Geom.point)
类似地,我们可以添加更多几何图形,例如 geom.line,以在图中生成更多层 −
julia> Gadfly.plot(iris, x = :SepalLength, y = :SepalWidth, Geom.point, Geom.line)
我们还可以设置关键字参数的颜色,如下所示 −
julia> Gadfly.plot(iris, x = :SepalLength, y = :SepalWidth, color = :Species, Geom.point)
Compose
Compose 是一个声明式矢量图形系统。 它也是由 Daniel Jones 编写的,作为 Gadfly 系统的一部分。 在Compose中,图形使用树结构定义,图元可以分类如下 −
Context − 它代表一个内部节点。
Form − 它表示定义一些几何形状(例如圆或线)的叶节点。
Property − 它代表一个叶节点,修改其父级子树的绘制方式。 例如,填充颜色和线宽。
Compose(x,y) − 它返回一棵以 x 为根、以 y 作为子节点的新树。
示例
下面的例子将绘制一个简单的图像 −
julia> using Compose julia> composition = compose(compose(context(), rectangle()), fill("tomato")) julia> draw(SVG("simple.svg", 6cm, 6cm), composition)
现在让我们通过用括号将子树分组来形成更复杂的树 −
julia> composition = compose(context(), (context(), circle(), fill("bisque")), (context(), rectangle(), fill("tomato"))) julia> composition |> SVG("simple2.svg")
图形引擎
在本节中,我们将讨论 Julia 中使用的各种图形引擎。
PyPlot
PyPlot 源于 PyCall 模块的先前开发,为 Python 的 Matplotlib 绘图库提供了 Julia 接口。 它使用 PyCall 包直接从 Julia 调用 Matplotlib。 要使用 PytPlot,我们需要进行以下设置 −
julia> using Pkg julia> pkg"up; add PyPlot Conda" julia> using Conda julia> Conda.add("matplotlib")
完成此设置后,您可以通过使用 PyPlot 命令简单地导入 PyPlot。 它可以让您在 matplotlib.pyplot 中调用函数。
示例
此示例来自 PyPlot 文档,将创建正弦调制的正弦曲线 −
julia> using PyPlot julia> x = range(0; stop=2*pi, length=500); julia> y = sin.(3 * x + 4 * cos.(2 * x)); julia> plot(x, y, color="blue", linewidth=1.0, linestyle="--") 1-element Array{PyCall.PyObject,1}: PyObject <matplotlib.lines.Line2D object at 0x00000000323405E0> julia> title("A sinusoidally modulated sinusoid") PyObject Text(0.5, 1.0, 'A sinusoidally modulated sinusoid')
PyPlot 包还可用于 3D 绘图,为此它可以从 Matplotlib 的 mplot3d 工具包导入函数。 我们也可以通过调用Axes3d的一些相应方法如bar3d、plot_surface、plot3d等直接创建3d图。
例如,我们可以绘制一个随机表面网格,如下所示 −
julia> surf(rand(20,30)) PyObject <mpl_toolkits.mplot3d.art3d.Poly3DCollection object at 0x00000000019BD550>
Gaston
Gaston是另一个有用的绘图包。 该绘图包提供了 gnuplot 的接口。
Gaston的一些特点如下 −
它可以使用图形窗口进行绘图,并且通过鼠标交互,可以同时保持多个绘图处于活动状态。
它可以直接绘制到 REPL。
它还可以在 Jupyter 和 Juno 中绘图。
它支持流行的二维图,例如茎图、步长图、直方图等。
它还支持流行的 3 维绘图,例如曲面、等高线和热图。
加载包、绘图并保存为 pdf 大约需要五秒钟。
示例
下面显示了 Gaston 帮助下的简单二维图 −
julia> x = 0:0.01:1 0.0:0.01:1.0 julia> plot(x, sin.(2π*5*t))
现在,我们可以添加另一条曲线,如下所示 −
julia> plot!(x, cos.(2π*5*t))
PyPlot can also be used to plot 3-d plots. Example is given below: julia> a = b = -10:0.30:10 -10.0:0.3:9.8 julia> surf(a, b, (a,b)->sin.(sqrt.(a.*a+b.*b))./sqrt.(a.*a+b.*b), title="Sombrero", plotstyle="pm3d")
PGF 图
PGFPlots 与 Gaston 不同,是一个相对较新的绘图包。 该绘图包使用 pgfplots LaTex 例程来生成绘图。 它可以轻松地与 IJulia 集成,将 SVG 图像输出到 notebook。 要使用它,我们需要安装以下依赖项 −
Pdf2svg,TikzPictures 需要。
Pgfplots,您可以使用 Latex 包管理器安装它。
GNUPlot,您需要绘制轮廓
完成这些安装后,您就可以使用 PGFPlots。
在此示例中,我们将在同一轴上生成多条曲线,并以 LaTex 格式分配它们的图例条目 −
julia> using PGFPlots julia> R = Axis( [ Plots.Linear(x->sin(3x)*exp(-0.3x), (0,8), legendentry = L"$\sin(3x)*exp(-0.3x)$"), Plots.Linear(x->sqrt(x)/(1+x^2), (0,8), legendentry = L"$\sqrt{2x}/(1+x^2)$") ]); julia> save("Plot_LinearPGF.svg", R);