Julia 朱莉娅:以0为中心的渐变色热图

Julia 朱莉娅:以0为中心的渐变色热图,julia,Julia,在热图中,我如何创建一个三色渐变,蓝色表示负值,红色表示正值,白色表示零值,这样,对于许多零值,热图的大部分将是白色(而不是默认渐变的浅红色) 此处渐变自动居中于中点,这是一个合理的默认值 相关: 后脚本 正如BallPointBen所建议的,计算值的范围似乎是推荐的方法。下面是一些基准测试。BallPointBen建议的最佳方法是max=max(abs,A) 您可以计算数组中的最大绝对值,然后使用它设置clims参数。c、 f 太好了,谢谢。对于clims,没有“内置”方法?对于大型数组来说

在热图中,我如何创建一个三色渐变,蓝色表示负值,红色表示正值,白色表示零值,这样,对于许多零值,热图的大部分将是白色(而不是默认渐变的浅红色)

此处渐变自动居中于中点,这是一个合理的默认值

相关:

后脚本

正如BallPointBen所建议的,计算值的范围似乎是推荐的方法。下面是一些基准测试。BallPointBen建议的最佳方法是
max=max(abs,A)


您可以计算数组中的最大绝对值,然后使用它设置
clims
参数。c、 f


太好了,谢谢。对于
clims
,没有“内置”方法?对于大型数组来说,一种更有效的方法是:
maximum(abs.(extrema(A))
,因为
extrema
在一次传递中获得最小值和最大值,
abs()
超过两个值,而不是数组的大小。@PatrickT实际上我认为首选的方法是使用
maximum(f,A)
。我已经更新了我的答案。增加了基准。我不知道如何使用
maximum
。谢谢!
A = [5 0 -3 -2 7; 0 5 0 0 0; -2 0 -1 0 0; -4 0 0 -10 0; 0 0 0 0 9]
using Plots
heatmap(Array(A),
    c = cgrad([:blue,:white,:red]),
    yflip = true,
    xlabel = "row", ylabel = "col",
    title = "Nonzeros, Positives, Negatives, in Matrix")
julia> using BenchmarkTools
julia> A = rand(10_000, 10_100)

julia> @btime max = maximum(abs.(A))
  432.837 ms (6 allocations: 770.57 MiB)
0.999999999929502

julia> @btime max = maximum(abs.(extrema(A)))
  339.597 ms (5 allocations: 144 bytes)
0.999999999929502

julia> @btime max = maximum(abs, A)
  60.690 ms (1 allocation: 16 bytes)
0.9999999985609005
julia> max_val = maximum(abs, A)
10

julia> heatmap(Array(A),
           c = cgrad([:blue,:white,:red]),
           yflip = true,
           xlabel = "row", ylabel = "col",
           title = "Nonzeros, Positives, Negatives, in Matrix",
           clims=(-max_val, max_val))