1

对于这个超级基本的问题,我深表歉意,但我在绘图方面没有经验,而且 Julia 绘图的许多文档都假设比我拥有更多的知识!

我正在使用 Plots 创建一个散点图,其中每个标记都是根据空间位置绘制的,我想按每个标记所持有的值的大小来缩放颜色。我这样创建了一个颜色渐变:

C(g::ColorGradient) = RGB[g[z] for z = LinRange(0,1,M)]
g = :inferno
cgrad(g,[0.01,0.99]) |> C

M 与标记的数量有关,这样我可以根据我拥有的标记数量创建合适的颜色比例。

我假设我正在创建某种结构,该结构将根据从 0.01 到 0.99 的值从该渐变中分配颜色。但是,我想我不明白结构 C 是什么。当我分配 color = C(v),其中 v 介于 0 和 1.00 之间时,我收到一条错误消息,指出 C 不接受 Float64 类型。

有没有办法可以根据它的值从这个渐变中为标记分配一些颜色?我将每个位置的所有值都存储在另一个数组中。

更新:我也尝试过对 C 进行索引。我将值转换为 Int64,范围为 1-99,并尝试设置 color=C[v],但 C 也不采用 Int64 类型。

更新 2:好的,所以我意识到我的问题是我不理解 |> 功能,所以我将代码重写为:

C(g::ColorGradient) = RGB[g[z] for z = LinRange(0,1,M)]
g = :inferno
myGrad = (cgrad(g,[0.00,1.00]) |> C)

现在我可以索引我的颜色渐变了!但是,我仍然在将颜色设置为存储在 myGradient 数组中的值时遇到问题。

for i = 1:M
    X,Y = find_coords(i,pd)
    colors = myGrad[c_index[i]]
    outline = rand(Float64,3)
    plt = plot!(X,Y,colors, markerstrokecolor = outline)
end

当我在 REPL 中键入 myGrad[c_index[i]] 时,它会绘制一种颜色。但是我从上面的代码中得到一个错误,它指出

“无法将 RGB{Float64} 转换为用于绘图的系列数据”

如果我按如下方式更改情节线,我会得到一个稍微不同的错误:

plt = plot!(X,Y,markercolor = colors, markerstrokecolor = outline)

错误:LoadError:MethodError:没有方法匹配 plot_color(::Float64)

所以由于某种原因,我不能存储这种颜色,作为我的情节的颜色变量。

4

1 回答 1

1

这里有几个不同的问题。首先,如果要创建散点图,您可能应该使用scatter. 在这里似乎也没有必要在循环中绘制事物,尽管很难说,因为您的代码不是最小工作示例 (MWE),因为它依赖于代码中其他地方定义的事物。

这是一个如何工作的示例:

using Plots

# Create a discrete color gradient with 20 points
my_colors = [cgrad(:inferno, [0.01, 0.99])[z] for z ∈ range(0.0, 1.0, length = 20)]

# Draw some random data points
x, y = sort(rand(100)), rand(100)
# Assign a color between 1 and 20 on the color grid to each point
z = sort(rand(1:20, 100))

# Plot
scatter(x, y, color = my_colors[z], markerstrokecolor = "white", label = "", 
            markersize = [10 for _ ∈ 1:100])

给出:

在此处输入图像描述

于 2020-05-14T10:43:18.697 回答