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

How to set custom x and y tick values in a Makie heatmap

我想在 Julia 中使用 Makie (CairoMakie) 在轴上自定义 xy 刻度值来制作热图,例如来自 Seaborn 的 this

关于如何修改图形以在 Y 轴上设置月份 JanuaryDecember 以及 X 轴上的年份 19491960 的任何建议-轴。

到目前为止我的代码:

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

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

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

ax.xticks = 1:12
ax.xtickformat = x -> string.(x .+ 1948)

不过,有一种更好的方法可以做到这一点。您可以通过在数据矩阵之前传递 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,
    )

你当然可以根据自己的喜好扩展它。

只需将 xticksyticks 添加到 Axis

ax = Axis(
    fig[1, 1], 
    xticks = (1:12, string.(1948 .+ (1:12))), 
    yticks = (1:12, Dates.monthname.(1:12)), 
    )