跳转到内容

Julia/绘图介绍

来自维基教科书,开放世界中的开放书籍
Previous page
处理日期和时间
Julia 介绍 Next page
元编程
绘图

Julia 中有很多用于绘图的包,可能其中一个符合您的需求和品味。本节是对其中一个包 Plots.jl 的简要介绍,它很有趣,因为它与许多其他绘图包进行交互。在使用 Julia 绘图之前,请下载并安装第一个绘图包或任何您选择使用的包(要获取提示,请按 ]

(v1.0) pkg> add Plots PyPlot GR UnicodePlots  # See also Gnuplot.jl (and Gaston.jl alternative for)

第一个包 Plots 是一个高级绘图包,它与其他绘图包交互,这些包在这里被称为“后端”。它们充当生成图形的图形“引擎”。每个包也是一个独立的绘图包,可以单独使用,但使用 Plots 作为界面的优势在于,正如您将看到的那样,它提供了更简单、更一致的界面。

另请参见功能强大的 Makie.jl,它与 Plots.jl 无关,并且有自己的后端,例如 GLMakie.jl,以及许多扩展,例如 AlgebraOfGraphics.jl(本文没有进一步解释,除了这个安装示例)

(v1.6) pkg> add GLMakie AlgebraOfGraphics

您可以在 Julia 会话中以通常的方式开始使用 Plots.jl 包

julia> using Plots

您通常希望绘制一个或多个**系列**,即数值的数组。或者,您可以提供一个或多个函数来生成数值。

在本例中,我们将绘制 2022 年 5 月份月球的相位(光照分数)。

julia> using AstroLib  # add if necessary with ] add AstroLib
julia> using Dates 
julia> points = DateTime(2022,05,01):Dates.Hour(1):DateTime(2022,05,31,23,59,59)
julia> moonphases = mphase.(jdcnv.(points)) 

现在我们有一个 Float64 值数组,每个值对应于一个月中的每个小时,代表月球盘面被照亮了多少。

julia> moonphases
744-element Vector{Float64}:
 0.0002806471321559201
 0.00041259024384365794
 0.0005791256946680035
 0.0007801698949687075
 0.0010156372084771381
 0.0012854399754271273
 ⋮
 0.015263669925646928
 0.016249662554591593
 0.017266056993952783
 0.018312770267986556
 0.019389718259650524
 0.020496815690093984

要绘制这些系列,只需将它们传递给 Plots 的 plot() 函数。

julia> plot(points, moonphases)

它使用了第一个可用的绘图引擎(GR.jl)。Plots 添加了其他绘图“家具”,然后为您绘制所有内容。

如果您想切换到不同的引擎,请使用提供的函数之一:gr()unicodeplots()plotly() 等等。例如,要切换到使用 Unicodeplots 绘图包(它使用 Unicode 字符来绘制图形,非常适合在 REPL/终端中使用),请执行以下操作

 julia> '''unicodeplots()'''
 
 julia> '''plot(moonphases)'''
    
     ┌────────────────────────────────────────┐ 
   1 │                .:''':.                 │ 
     │               .:     '.                │ 
     │              :'       ':               │ 
     │             :'         '.              │ 
     │            .'           :.             │ 
     │           .:             :             │ 
     │          .:               :            │ 
     │         .:                ':           │ 
     │         :                  :.          │ 
     │        :                    :.         │ 
     │       :'                     :.        │ 
     │      :'                       :.       │ 
     │    .:                          :.      │ 
     │   .:                            :.     │ 
   0 │..:'                              ':....│ 
     └────────────────────────────────────────┘

自定义绘图

[编辑 | 编辑源代码]

Plots.jl 包有 大量文档,学习之后,您将能够花几个小时调整和定制您的绘图,直到满意为止。这是一个关于一年中每一天的时间方程的绘图示例。

x 轴上的刻度是 1:365 中的数字。最好能看到日期本身。首先,创建字符串

julia> days = Dates.DateTime(2018, 1, 1, 0, 0, 0):Dates.Day(1):Dates.DateTime(2018, 12, 31, 0, 0, 0)
julia> datestrings = Dates.format.(days, "u dd")

提供的 xticks 选项值是一个元组,包含两个数组/范围

(xticks = (1:14:366, datestrings[1:14:366])

第一个提供数值,第二个提供刻度的匹配文本标签。

额外标签和图例很容易添加。您可以从 Colors.jl 包中访问颜色

julia>  plot!(                                    
    eq_values,                                        
                                                      
    label  = "equation of time (calculated)",     
    line=(:black, 0.5, 6, :solid),                
                                                  
    size=(800, 600),                              
                                                  
    xticks = (1:14:366, datestrings[1:14:366]),   
    yticks = -20:2.5:20,                          
                                                  
    ylabel = "Minutes faster or slower than GMT", 
    xlabel = "day in year",                       
                                                  
    title  = "The Equation of Time",              
    xrotation = rad2deg(pi/3),                    
                                                  
    fillrange = 0,                                
    fillalpha = 0.25,                             
    fillcolor = :lightgoldenrod,                  
                                                  
    background_color = :ivory                     
    )                                             

examples of plotting in Julia using Plots.jl

其他包

[编辑 | 编辑源代码]

UnicodePlots

[编辑 | 编辑源代码]

如果您经常在 REPL 中工作,也许您想要一种快速简便的方法来绘制使用文本而不是图形进行输出的绘图?UnicodePlots.jl 包使用 Unicode 字符来绘制各种绘图,避免了加载各种图形库的必要性。它可以生成

  • 散点图
  • 线图
  • 条形图(水平)
  • 阶梯图
  • 直方图(水平)
  • 稀疏模式
  • 密度图

如果尚未安装,请下载并将其添加到您的 Julia 安装中

pkg> add UnicodePlots

您只需要执行一次此操作。现在您可以加载模块并导入函数

julia> using UnicodePlots

以下是一个关于线图的简要示例

julia> myPlot = lineplot([1, 2, 3, 7], [1, 2, -5, 7], title="My Plot", border=:dotted)
                       My Plot
      ⡤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⢤
   10 ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸
      ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸
      ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠔⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸
      ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡠⠊⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸
      ⡇⠀⠀⠀⠀⠔⠒⠊⠉⢣⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⠔⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸
      ⡇⠉⠉⠉⠉⠉⠉⠉⠉⠉⠫⡉⠉⠉⠉⠉⠉⢉⠝⠋⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠁⢸
      ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠱⡀⠀⢀⡠⠊⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸
      ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠑⠔⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸
      ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸
  -10 ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸
      ⠓⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠚
      0                                       10

以下是一个密度图的示例

julia> myPlot = densityplot(collect(1:100), randn(100), border=:dotted)
      ⡤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⢤
   10 ⡇                                        ⢸
      ⡇                                        ⢸
      ⡇                                        ⢸
      ⡇                                        ⢸
      ⡇                                        ⢸
      ⡇                                        ⢸
      ⡇                                        ⢸
      ⡇                            ░           ⢸
      ⡇ ░░░        ░ ▒░  ▒░     ░  ░ ░ ░ ░   ░ ⢸
      ⡇░░  ░▒░░▓▒▒ ▒░░ ▓░░ ░░░▒░ ░ ░   ▒ ░ ░▒░░⢸
      ⡇▓▒█▓▓▒█▓▒▒▒█▒▓▒▓▒▓▒▓▓▒▓▒▓▓▓█▒▒█▓▒▓▓▓▓▒▒▒⢸
      ⡇    ░     ░         ░░░ ░    ▒ ░ ░ ░░ ░ ⢸
      ⡇                          ░             ⢸
      ⡇                                        ⢸
      ⡇                                        ⢸
      ⡇                                        ⢸
      ⡇                                        ⢸
      ⡇                                        ⢸
      ⡇                                        ⢸
  -10 ⡇                                        ⢸
      ⠓⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠚
      0                                      100

(请注意,它需要终端环境才能使显示的图形 100% 成功 - 当您复制粘贴时,部分魔法会丢失。)

允许您在 Web 浏览器窗口中创建可视化。VegaLite 是一种**可视化语法**,用于创建和保存可视化设计的声明性格式。使用 VegaLite,您可以使用 JSON 格式描述数据可视化,并使用 HTML5 Canvas 或 SVG 生成交互式视图。您可以生成

  • 面积图
  • 条形图/直方图
  • 线图
  • 散点图
  • 饼图/甜甜圈图
  • 瀑布图
  • 词云

要使用 VegaLite,首先将该包添加到您的 Julia 安装中。您只需要执行一次此操作

pkg> add VegaLite

以下是如何创建堆叠面积图。

julia> using VegaLite
julia> x = [0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9]
julia> y = [28, 43, 81, 19, 52, 24, 87, 17, 68, 49, 55, 91, 53, 87, 48, 49, 66, 27, 16, 15]
julia> g = [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1]
 
julia> a = areaplot(x = x, y = y, group = g, stacked = true)

graphic created with Julia and Vega.jl

VegaLite 的一个通用功能是,您可以在创建可视化之后对其进行修改。因此,让我们使用函数更改颜色方案(请注意“!”表示参数已修改)

julia> colorscheme!(a, ("Reds", 3))

graphic created with Julia and Vega.jl

您可以通过提供两个数组来轻松创建饼图(和甜甜圈图)。x 数组提供标签,y 数组提供数量

julia> fruit = ["peaches", "plums", "blueberries", "strawberries", "bananas"];
julia> bushels = [100, 32, 180, 46, 21];
julia> piechart(x = fruit, y = bushels, holesize = 125)

a pie/donut chart created in Julia/Vega.jl

华夏公益教科书