【问题标题】:Can I assign specific values from a ColorGradient to a marker?我可以将 ColorGradient 中的特定值分配给标记吗?
【发布时间】:2020-08-30 00:22:47
【问题描述】:

对于这个超级基本的问题,我深表歉意,但我在绘图方面没有经验,而且 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 进行索引。我将值转换为 1-99 的 Int64,并尝试设置 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)

所以由于某种原因,我无法将此颜色存储为我的绘图的颜色变量。

【问题讨论】:

    标签: julia plots.jl


    【解决方案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])
    

    给予:

    【讨论】:

    • 啊,是的,对不起!我应该关闭它,因为我让它工作了。它处于一个循环中,因为它绘制了不同的标记社区。每个标记社区都应该有相同的颜色关联,但我想对不同社区的颜色进行热图。循环的每次迭代都会从大小为 N 的总数据集中绘制一个大小为 M 的社区。感谢您抽出时间回复,我很感激 :) !
    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 2010-11-29
    • 2020-04-21
    • 2020-10-04
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多