如何在 Makie 热图中设置自定义 x 和 y 刻度值
How to set custom x and y tick values in a Makie heatmap
我想在 Julia 中使用 Makie (CairoMakie) 在轴上自定义 x
和 y
刻度值来制作热图,例如来自 Seaborn 的 this。
关于如何修改图形以在 Y 轴上设置月份 January
至 December
以及 X 轴上的年份 1949
至 1960
的任何建议-轴。
到目前为止我的代码:
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,
)
你当然可以根据自己的喜好扩展它。
只需将 xticks
和 yticks
添加到 Axis
ax = Axis(
fig[1, 1],
xticks = (1:12, string.(1948 .+ (1:12))),
yticks = (1:12, Dates.monthname.(1:12)),
)
我想在 Julia 中使用 Makie (CairoMakie) 在轴上自定义 x
和 y
刻度值来制作热图,例如来自 Seaborn 的 this。
关于如何修改图形以在 Y 轴上设置月份 January
至 December
以及 X 轴上的年份 1949
至 1960
的任何建议-轴。
到目前为止我的代码:
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,
)
你当然可以根据自己的喜好扩展它。
只需将 xticks
和 yticks
添加到 Axis
ax = Axis(
fig[1, 1],
xticks = (1:12, string.(1948 .+ (1:12))),
yticks = (1:12, Dates.monthname.(1:12)),
)