如何在 Makie 热图中设置自定义 x 和 y 刻度值

Ren*_*ene 3 data-visualization heatmap julia makie.jl

我想使用 Makie (CairoMakie) 在 Julia 中制作一张热图,轴上带有自定义值x和刻度值,就像 Seaborn 中的这个一样y

有关如何修改数字以将Y 轴上January的月份和X 轴上的年份的任何建议。December19491960

到目前为止我的代码:

using DataFrames
using CSV
using CairoMakie

download("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/flights.csv", "flights.csv")
flights = DataFrame(CSV.File("flights.csv"))

data = Array(unstack(flights, :year, :month, :passengers)[!, 2:end])

fig = Figure()
ax = Axis(fig[1, 1], xlabel = "Year", ylabel = "Month")
hm = heatmap!(ax, data)

Colorbar(fig[1, 2], hm)

text!(ax,
    string.(data'),
    position = [Point2f(x, y) for x in 1:12 for y in 1:12],
    align = (:center, :center),
    color = ifelse.(data' .< 400, :white, :black),
    textsize = 14,
    )

save("figure.png", fig)

fig
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Ans*_*hvi 5

如果您只想手动设置刻度,您可以这样做:

using Dates
ax.yticks = 1:12
ax.ytickformat = x -> Dates.monthname.(Int.(x))

ax.xticks = 1:12
ax.xtickformat = x -> string.(x .+ 1948)
Run Code Online (Sandbox Code Playgroud)

不过,有一种更好的方法可以做到这一点。您可以通过在数据矩阵之前传递 x 和 y 的向量或范围来指定热图的数据范围。

您可以通过简单地传递所需的 x 和 y 范围来完成此操作,如下所示:

f = download("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/flights.csv")
flights = DataFrame(CSV.File(f))

data = unstack(flights, :year, :month, :passengers)

years = data.year

mat = Array(data[!, 2:end])

heatmap(years, 1:12, mat; axis = (yticks = 1:12, ytickformat = x -> Dates.monthname.(Int.(x)), xticks = years))
text!(
    string.(data'),
    position = [Point2f(x, y) for x in 1:12 for y in 1:12],
    align = (:center, :center),
    color = ifelse.(data' .< 400, :white, :black),
    textsize = 14,
    )
Run Code Online (Sandbox Code Playgroud)

数字

当然,您可以扩展它,但适合您的口味。