有时需要在规则网格上绘制分类值以显示它们如何覆盖某个区域。原则上,plot() 函数非常适合这种情况,但是有一个问题需要每次调整图标的大小以创建实体封面的错觉。更改图像的覆盖范围时,旧尺寸变得无关紧要,需要再次调整。有没有一种技术可以自动调整这个大小?
using Plots
using CategoricalArrays
a = [1, 2, 3, 1, 2, 3, 1, 2, 3]
b = [1, 1, 1, 2, 2, 2, 3, 3, 3]
c = CategoricalArray(["X", "X", "Y", "Z", "Y", "Y", "Z", "Y", "Z"])
plot(a, b, group = c, seriestype = :scatter, aspect_ratio = 1, markersize=90,
markershape=:square, markerstrokewidth=0.0, xlim = (0.5, 3.5), ylim = (0.5, 3.5))
Run Code Online (Sandbox Code Playgroud)
结果在所有方面都很好,除了每次需要调整单元格的大小以使没有重叠区域或间隙时:
作为替代方案,我考虑了 heatmap(),但它对分类数据的工作非常奇怪,通过连续的值渐变为它们设置某种规模。我还没有遇到任何使用 heatmap() 会得到带有像 plot() 这样美丽图例的地图的例子,所以我不确定在这里使用 heatmap() 是否正确。
a = b = [1, 2, 3]
c = CategoricalArray(["X" …Run Code Online (Sandbox Code Playgroud) 将分类数组转换为简单数值数组的完美方法是什么?例如:
using CategoricalArrays
a = CategoricalArray(["X", "X", "Y", "Z", "Y", "Y", "Z"])
b = recode(a, "X"=>1, "Y"=>2, "Z"=>3)
Run Code Online (Sandbox Code Playgroud)
作为转换的结果,我们仍然得到一个分类数组,即使我们明确指定了赋值的类型:
b = recode(a, "X"=>1::Int64, "Y"=>2::Int64, "Z"=>3::Int64)
Run Code Online (Sandbox Code Playgroud)
看起来这里需要一些其他方法,但我想不出一个方向
当前获取列名包含给定元素的所有组合的数组的最优雅的方法是什么?R 中的函数的一些最接近的类似物。expand.grid()我在这个问题上遇到的所有讨论都是关于问题的稍微不同的表述,或者是在 Julia 的非常旧版本的时代进行的。目前我发现的最合理的解决方案如下:
using DataFrames
xy = [[x,y] for x in 0:0.25:1 for y in 0:0.25:1]
xy_array = permutedims(reshape(hcat(xy...), (length(xy[1]), length(xy))))
df = DataFrame(x = xy_array[:,1], y = xy_array[:,2])
Run Code Online (Sandbox Code Playgroud)
R 中的类似表达式可以写得更紧凑:
xy_comb <- expand.grid(x=seq(0, 1, 0.25), y=seq(0, 1, 0.25))
Run Code Online (Sandbox Code Playgroud)
在 Julia 中是否有更简洁的形式来编写相同的表达式?
有一个包含超过 10,000 对 Float64 值的数组。像这样的东西:
v = [[rand(),rand()], ..., [rand(),rand()]]
Run Code Online (Sandbox Code Playgroud)
我想从中得到一个包含两列的矩阵。可以用一个循环绕过所有对,它看起来很麻烦,但在几分之一秒内给出结果:
x = Vector{Float64}()
y = Vector{Float64}()
for i = 1:length(v)
push!(x, v[i][1])
push!(y, v[i][2])
end
w = hcat(x,y)
Run Code Online (Sandbox Code Playgroud)
permutedims(reshape(hcat(v...), (length(v[1]), length(v))))我在此任务中找到的解决方案看起来更优雅但完全挂起 Julia,需要重新启动会话。也许六年前它是最佳的,但现在它不适用于大型阵列。有没有既紧凑又快速的解决方案?
例如,对于向量的每个元素,我想计算残差与该向量的其他元素的总和。这适用于一个元素:
a = [1, 2, 5, 7, 8, 22]
f(x) = sum(abs.(x .- a))
f(2)
Out: 35
Run Code Online (Sandbox Code Playgroud)
但是如果使用 map() 将此函数应用于所有元素,Julia 将返回错误:
map(a, f)
Out: "MethodError: no method matching iterate(::typeof(f))"
Run Code Online (Sandbox Code Playgroud)
在 R 中,使用 sapply() 很容易获得:
a = c(1, 2, 5, 7, 8, 22)
sapply(a, function(x) sum(abs(x - a)))
Out: 39 35 29 29 31 87
Run Code Online (Sandbox Code Playgroud)
在 Julia 中是否有同样优雅的方法来做到这一点?