代码之家  ›  专栏  ›  技术社区  ›  youpilat13 Ty Petrice

想要在三点联合分布上再现关于重叠轮廓的相同逻辑推理

  •  0
  • youpilat13 Ty Petrice  · 技术社区  · 4 年前

    我有下图,我想应用相同的逻辑推理来绘制不同椭圆(由颜色标识)的所有轮廓和内容。

    在这个例子中,有4个矩阵被绘制出来。在下面的例子中,我有5个矩阵(见5个图例),但这并不重要。

    这里是这个情节:

    Logical of overlapping to reproduce

    您将看到,对于每种颜色,我们都有一个浅色和深色着色器:这对应于1个置信水平(1 C.L=深色着色器)和2 C.L(浅色着色器)。

    就我的问题而言,我正在谈论非对角线盒子。黄色是最小的区域,这意味着我们有最好的约束(图例中的每种颜色对应一个协方差矩阵)。

    现在,我想重现一下重叠的方式。这里是我的脚本的第一次尝试(有5个矩阵,但我们不在乎,它只是一个额外的颜色和2个轮廓,深色和浅色)。

    my last triplot

    正如你所看到的,这并不是很漂亮和明确(我们甚至可以说,区分轮廓作为增加的函数是一团糟 Figure of Merit (价值 FoM 在传说中)。

    我设置了以下代码片段来处理不同颜色椭圆之间的优先级(FoM与椭圆面积成反比):

    下面要修改的部分要有正确和智能的重叠:

    for tick in g.fig.axes[0].xaxis.get_major_ticks():
      tick.tick1line.zorder = 5
    
    # Ordering applied here : try to be coherent in the overlapping
    # by putting over all the smallest (yellow, 1 C.L) and ends by lowest 
    # FoM, here, blue light (2 C.L) 
    for ax in g.fig.axes:
      geo = ax.get_geometry()
      if (geo[2]-1) // geo[0] > (geo[2]-1) % geo[0]:
        for c,z in zip(ax.collections, [0.1, 0.3, 0.5, 0.7, 2, 0.2, 0.4, 0.6, 0.8, 2]):
          c.zorder = z
    

    该脚本可直接在以下网站上获取: script to modify

    对于非对角线框,我不想复制与开始时完全相同的数字(因为数据不一样) 但我希望重现相同的重叠逻辑和透明度对第一幅图的影响)。

    您可以在此处找到包含脚本的整个存档: script to fix for overlapping

    特别是设置轮廓之间的排序或优先级的代码片段,上面已经给出了分配 c.zorder = z .

    我已经发布了类似的问题,但只针对2个矩阵: old post with only 2 matrices to plot, i.e 2x2 = 4 contours ellipse 这里,如果我考虑了每种颜色的1C.L和2C.L椭圆,我总共有5x2=10个轮廓。

    PS:生成这个“triplot”(“tri”类似于“三角形”)的python库是 getdist .

    主要程序是:

    # Call triplot
    g.triangle_plot([matrix1, matrix2, matrix3, matrix4, matrix5],
                    names,
                    filled = True,
                    legend_labels = [],
                    contour_colors = ['darkblue','purple','red','orange','yellow'],
                    line_args = [{'lw':2, 'color':'darkblue'},{'lw':2, 'color':'purple'},
    {'lw':2, 'color':'red'},{'lw':2, 'color':'orange'}, {'lw':2, 'color':'yellow'}]
                    )
    

    编辑1: 我认为我可以在所有不同的轮廓(1 C.L和2 C.L置信水平)之间增加透明度,但我担心这会使事情变得更加复杂。

    最后一句话:最小的黄色轮廓必须像示例的第一幅图一样完全填充。但是c.order=z被设置为错误的值,这意味着这样的结果是不连贯的。

    从你的角度来看,理想的c.order排序是什么,应用的标准是什么:例如,我认为将盒子的最大xlim/ylim设置为最大的椭圆2C.L(浅“深蓝色”轮廓),然后将所有其他轮廓作为其面积的函数推到最小的一个(黄色)。

    顺便说一句,这里有一个我在网上看到的透明度的例子:

    yellow over blue itself over red

    也就是说,黄色在蓝色之上,而蓝色在红色之上:这就是我想在我的三联图上复制的(考虑到重叠的类似顺序)。

    编辑2 :我做了一次尝试,没有考虑手动确定重叠优先级的代码片段。

    通过删除这段代码并再次绘制,我得到了这个图:

    Hidden policy of overlapping but results better

    它比我的第一个数字好一点(例如,黄色轮廓像橙色轮廓一样完全填充)。但我不知道重叠的优先级是如何实现的。我必须查看更多的来源 getdist 图书馆,但这将是一项艰巨的任务。

    我希望了解getdist中默认的重叠策略。

    编辑3: 我意识到,一些有趣的事情可以解决我关于重叠顺序和透明度的问题,如图所示 编辑1 :对于我想得到的数字,目标是设置超过黄色1.CL和2.CL,之后是橙色1.C.L和2C.L等。。。按照优先顺序。

    诀窍应该是保持给定颜色的1 C.L和2 C.L的轮廓,只让这些轮廓的虚线可见,而不考虑下面轮廓的颜色。

    这样,我就可以区分其他颜色的所有较低轮廓。

    如果一些较低的轮廓覆盖了所有其他轮廓,则会出现纯色,并且由于没有重叠,因此不会应用透明度。

    实际上,在下面的两个图中(显示了我想要的渲染),我希望有一个相同的但有所改变的,即1 C.L纯黄色区域有线条轮廓,2 C.L浅黄色区域也有轮廓线,它们覆盖在所有其他轮廓之上。

    first illustration

    second illustration

    例如,你可以在这两个图上看到黄色1C.L不是真正的纯黄色。2 C.L黄色也有同样的问题,它不是真正的浅黄色。

    现在,我必须:

    • 寻找如何为1 C.L和2 C.L(而不仅仅是2 C.L置信水平)设置轮廓

    • 将透明度应用于所有其他下方轮廓的轮廓线,并保持纯黄色1 C.L和浅黄色2 C.L的完整性。注意,我想要的是轮廓线上的透明度,而不是颜色本身的透明度。

    我承认这有点棘手,但我认为这是可能的( getdist ,我必须搜索必要的选项,或者能够 找到一种方法,在不混合每种颜色的所有透明度的情况下,通过重叠来实现这种排序。

    0 回复  |  直到 4 年前