Plots.jl 一个友好的。。嗯。。教程哈哈哈(1)


#1

简说

由于现在很多JL 的包不成熟–要么没有升级至>=1的版本,要么本身就还画风不稳定,在大多数情况下我还是选择用Plots.jl 其他的包,如Makie(一个对OpenGL的接口),GadFly(一个类似ggplot的包)也有突出的地方,不过应该要等一段时间才能稳定下来。
本文将说明,通过很少的努力,和很少的代码,我们可以用Plots.jl生成好的(美丽而有意义的)图。之后我将简单评论普通的做图指令在"图形的语法"大为流行的今天,仍具有的一定优势。

环境:

versioninfo()
Julia Version 1.1.0
Commit 80516ca202 (2019-01-21 21:24 UTC)
Platform Info:
  OS: Windows (x86_64-w64-mingw32)
  CPU: Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-6.0.1 (ORCJIT, skylake)
Environment:
  JULIA_EDITOR = "C:\Users\DELL\AppData\Local\atom\app-1.38.2\atom.exe"  -a
  JULIA_NUM_THREADS = 4

啊我怎么才1.60Hz的小短腿。算了不管CPU了。

基本语法

Plots.jl,如果没有理解错的话,是本着“不用学”(things should JUST WORK)的理念设计的。同样一个图形效果可以有不同的指令做出。

按顺序做出100个正态随机点的连线(使用randn生成)

推荐使用gr()做引擎,因为,快速稳定。
如果换成使用plotly()则可以打开一个互动界面。

using Plots
x = randn(100)
y = randn(100)
gr()
plot(x,y)

1

毫无意义,我想要散点图,换作 scatter

scatter(x,y)

除此之外,plots.jl 还有很多预定义的图的功能。比如块状图(raster),等高线图(contour),还有很多预制的图形,比如贝叶斯曲线等。我们在下一贴将详细介绍做图本身

我都想要!

注意这个叹号的额外用途(在已有的变量上直接修改)。在平时的编程中,带有叹号的函数将会修改变量自身,比如。
append!
sort!
感觉自己在讲英语。

其实,
plot!
scatter!
contour!
也是在一个图像对象上修改罢了。

图像是数据,这并没有什么稀奇。关键在于。对于某个图像的设置(数据,颜色,线条等等)可以被保存成一个对象(Object)。这个对象存储着所有重建这个图的信息。同样,这个对象可以被修改。

p = plot(x,y)
typeof(p)
dump(p)

那么p这个对象的形式是

Plot{Plots.GRBackend}

balabala…

如果你还不信,用dump()来把内容“倾倒”出来

Plots.Plot{Plots.GRBackend}
  backend: Plots.GRBackend Plots.GRBackend()
  n: Int64 1
  attr: Dict{Symbol,Any}
    slots: Array{UInt8}((64,)) UInt8[0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01  …  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x01]
    keys: Array{Symbol}((64,))

balabala…

p = plot(x,y)
p = scatter!(p,x,y)

这与下面这段代码是等效的

plot(x,y)
scatter!(x,y)

2
不过,p这个对象有名字,这样以后就可以抽冷子把他拎出来添加或者改变一些东西。反之,如果有个没名字的图,那么对它的修改则限制于邻近的命令(你只能匿名地修改上一个图)

colorkey

颜色地面板可以关掉,为了直观我将用p来修改

plot!(p;key=false)

3
看,不但能填,也能减。
等会,为啥这时候p变成了第一命令?这是多分派在可视化包上的使用。
其实对这种语法的使用争议也不小。安全的使用这个语法是建立在假设你

分号之后的关键字:keyword arguments,以及Attributes 的名单

;之后常常作为调节图像的不是必须的选项(你不动它,它就在默认位置)。

类似于上面的key,这里有很多的关键字。
问题在于,文档里并没有说明关键字都有哪些
?plot 将不会返回有用的信息

查询这里:
http://docs.juliaplots.org/latest/attributes/

attributes甚至可以让你把点图调节成折线图(将在下一个帖子整理)。

保存图像

你可以用savefig() 来保存,如果图像是个图像对象,那么最好把图像对象填成第一个命令。(如果没有则默认保存上一个图)

savefig("1.png")

或者
savefig(p,“1.png”)

如果换成使用plotly,那么直接点保存建或者截图或者浏览器打印就可以了

下一个帖子将整理更多关于图像本身的问题


#2

感觉还是matplotlib画的好看。只是python调用慢一点而已。