Julia Plots.jl:从系列配方更改标记颜色

时间:2018-08-03 17:54:32

标签: julia plots.jl

我正在尝试整理一个Plots.jl用户食谱,该食谱将创建多个散点图和直方图,并以网格的形式排列。散点图应占据网格的下部三角形。直方图在对角线上。每个散点图应有多个系列,以不同的颜色显示。各子图之间的颜色应保持一致。

我的问题是,当我允许用户指定自定义颜色时,散点图中的系列颜色会变得混乱。

这是(节略的)配方代码。 data是大小为r的向量。 data的每个元素都是大小为n_r x d的矩阵。 n_r可能有所不同,d保持不变。应该有d x (d-1) / 2个散点图,每个图上有r个系列,每个系列都有n_r个点。

@recipe function my_func(data::my_type; custom_colors=nothing)
    # get d, r, ...
    for i in i:d
        for j in 1:d
            @series begin
                subplot := (i - 1) * d + j
                if i == j
                    seriestype := :histogram
                    plot_data = # ... prepare data for histograms
                elseif j < i
                    # scatter subplot recipe
                    seriestype := :scatter
                    if custom_colors !== nothing
                        color := reshape(custom_colors, (1, r))
                    end
                    x = Vector()
                    y = Vector()
                    for r in runs
                        ser = data[r]
                        append!(x, [ser[:, j]])
                        append!(y, [ser[:, i]])
                    end # for r
                    plot_data = (x, y)
                else
                    # leave empty
                    plot_data = [0]
                end #  if/else
                plot_data  # return from the macro function
            end # @series
        end # for j
    end # for i
end # @recipe

我的问题是,每当我提供自定义颜色时,各子图之间都会出现不一致:

plot(my_data, custom_colors=["blue", "green", "black"])

plot with custom colors

请注意子图(2,1)的中间如何有黑点,而所有其他散点图都在外面有黑

如果我在没有自定义颜色的情况下进行绘图:

plot(my_data)

在所有散点图中,我得到一致的颜色:

enter image description here

有什么线索为什么在第一个绘图中会混合颜色?

1 个答案:

答案 0 :(得分:0)

好的,这里的窍门是,每个散点图上的每个系列都应使用自己的宏进行绘制。换句话说,@series ... end应该放在for r in runs ... end内部。还有一个单独的@series宏,用于代码的其他每个分支。