跳轉到內容

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

華夏公益教科書