我可以将 ColorGradient 中的特定值分配给标记吗?

Posted

技术标签:

【中文标题】我可以将 ColorGradient 中的特定值分配给标记吗?【英文标题】:Can I assign specific values from a ColorGradient to a marker? 【发布时间】: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]] 时,它会绘制一种颜色。但是我从上面的代码中得到了一个错误,它指出

“无法将 RGBFloat64 转换为系列数据进行绘图”

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

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

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

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

【问题讨论】:

【参考方案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 的社区。感谢您抽出时间回复,我很感激 :) !

以上是关于我可以将 ColorGradient 中的特定值分配给标记吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 CAGradientLayer 上方显示 SCNScene

jQuery .animate() 不响应毫秒设置

是否可以将 mongoDB 中的更新查询限制为特定限制?

您可以将特定线程 ID 分组到 OpenMP 中的唯一任务组中吗?

是否可以将“NSTextfield”仅绑定到 NSArray 或 NSSet/Relationship 中的一个特定条目

pandas使用cut函数基于分位数进行连续值分箱(手动计算分位数)处理后出现NaN值原因及解决