Julia在Gadfly中绘制未知数量的图层

5

我想在Julia中创建一个图表(目前使用Gadfly,但也可以考虑使用其他包)。我有一个多维数组。对于固定的维度大小(例如4875x3x3),一个合适的图表应该是:

p=Gadfly.plot( 
   layer(y=sim1.value[:,1,1],x=[sim1.range],Geom.line, Theme(default_color=color("red"))), 
   layer(y=sim1.value[:,1,2],x=[sim1.range],Geom.line, Theme(default_color=color("blue"))), 
   layer(y=sim1.value[:,1,3],x=[sim1.range],Geom.line, Theme(default_color=color("green")))
)

但总的来说,我希望能够编写一个绘图语句,其中我不知道sim1.value数组的第三个维度。我该如何编写这样的语句?

也许可以像下面这样:

p=Gadfly.plot([layer(y=sim1.value[:,1,i],x=[sim1.range], Geom.line, Theme(default_color=color("red"))) for i in 1:size(sim1)[3]])

但是这种方法行不通。

我通过将数组转换为数据框并添加一列来指示第三维是什么,成功解决了此问题,但我想知道能否在不创建数据框的情况下完成此操作。

数据看起来像这样:

julia> sim1.value
4875x3x3 Array{Float64,3}:
[:, :, 1] =
  0.201974   0.881742  0.497407
  0.0751914  0.921308  0.732588
 -0.109084   1.06304   1.15962 
 -0.0149133  0.896267  1.22897 
  0.717094   0.72558   0.456043
  0.971697   0.792255  0.40328 
  0.971697   0.792255  0.227884
 -0.600564   1.23815   0.499631
 -0.881391   1.07994   0.59905 
 -0.530923   1.00278   0.447363
  ⋮                            
  0.866138   0.657875  0.280823
  1.00881    0.594015  0.894645
  0.470741   0.859117  1.09108 
  0.919887   0.540488  1.01126 
  2.22095    0.194968  0.954895
  2.5013     0.202698  2.05665 
  1.94958    0.257192  2.01836 
  2.24015    0.209885  1.67657 
  0.76246    0.739945  2.2389  
  0.673887   0.640661  2.15134 

[:, :, 2] =
  1.28742   0.760712  1.61112 
  2.21436   0.229947  1.87528 
 -1.66456   1.46374   1.94794 
 -2.4864    1.84093   2.34668 
 -2.79278   1.61191   2.22896 
 -1.46289   1.21712   1.96906 
 -0.580682  1.3222    1.45223 
  0.17112   1.20572   0.74517 
  0.734113  0.629927  1.43462 
  1.29676   0.266065  1.52497 
  ⋮                           
  1.2871    0.595874  0.195617
  1.84438   0.383567  1.15537 
  2.12446   0.520074  0.957211
  2.36307   0.222486  0.402168
  2.43727   0.19843   0.636037
  2.33525   0.302378  0.811371
  1.09497   0.605816  0.297978
  1.366     0.56246   0.343701
  1.366     0.56246   0.219561
  1.35889   0.630971  0.281955

[:, :, 3] =
  0.649675  0.899028  0.628103
  0.718837  0.665043  0.153844
  0.914646  0.807048  0.207743
  0.612839  0.790611  0.293676
  0.759457  0.758115  0.280334
  0.77993   0.774677  0.396879
 -1.63825   1.38275   0.85772 
 -1.43517   1.45871   0.835853
 -1.15413   1.35757   1.05071 
 -1.10967   1.37525   0.685986
  ⋮                           
  1.15299   0.561492  0.680718
  1.14853   0.629728  0.294947
  1.65147   0.517422  0.22285 
  1.65147   0.517422  0.517451
  1.78835   0.719658  0.745866
  2.36554   0.426616  1.49432 
  0.855502  0.739237  1.24224 
 -0.175234  0.701025  1.07798 
 -0.221313  0.939255  1.3463  
  1.58094   0.368615  1.63817 

3
没试过,但是在这里“splatting”起作用吗?p = Gadfly.plot([layer(y=sim1.value[:,1,i],x=[sim1.range], Geom.line, Theme(default_color=color("red"))) for i in 1:size(sim1)[3]]...) - rickhg12hs
展开语法确实有效!谢谢。您可以将其发布为答案,我可以选择它。是否有一种方法可以在推导式中使用 i 来获得颜色序列? - bdeonovic
另一个选项是使用add_plot_element,请参见此问题 - Pontus Granström
1个回答

8
显然,“splatting”(如果这是正确的术语的话)在这里有效。请尝试:
p=Gadfly.plot([layer(y=sim1.value[:,1,i],x=[sim1.range], Geom.line, Theme(default_color=color("red"))) for i in 1:size(sim1)[3]]...)

对于不同的层颜色,这只是一个猜测/黑客(欢迎进行正确性编辑)。

p=Gadfly.plot([layer(y=sim1.value[:,1,i],x=[sim1.range], Geom.line, Theme(default_color=color(["red" "blue" "green" "cyan" "magenta" "yellow"][i%6+1]))) for i in 1:size(sim1)[3]]...)

也许Gadfly的Scale颜色参数可以在这里帮助解决问题。
补充说明:
请参见下面的第一个评论以获取颜色选择方法。

3
我使用了distinguishable_colors(size(sim1)[3])[i]来获取足够的颜色数目。 - bdeonovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接