我有下图,我想应用相同的逻辑推理来绘制不同椭圆(由颜色标识)的所有轮廓和内容。
在这个例子中,有4个矩阵被绘制出来。在下面的例子中,我有5个矩阵(见5个图例),但这并不重要。
这里是这个情节:
您将看到,对于每种颜色,我们都有一个浅色和深色着色器:这对应于1个置信水平(1 C.L=深色着色器)和2 C.L(浅色着色器)。
就我的问题而言,我正在谈论非对角线盒子。黄色是最小的区域,这意味着我们有最好的约束(图例中的每种颜色对应一个协方差矩阵)。
现在,我想重现一下重叠的方式。这里是我的脚本的第一次尝试(有5个矩阵,但我们不在乎,它只是一个额外的颜色和2个轮廓,深色和浅色)。
正如你所看到的,这并不是很漂亮和明确(我们甚至可以说,区分轮廓作为增加的函数是一团糟
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(浅“深蓝色”轮廓),然后将所有其他轮廓作为其面积的函数推到最小的一个(黄色)。
顺便说一句,这里有一个我在网上看到的透明度的例子:
也就是说,黄色在蓝色之上,而蓝色在红色之上:这就是我想在我的三联图上复制的(考虑到重叠的类似顺序)。
编辑2
:我做了一次尝试,没有考虑手动确定重叠优先级的代码片段。
通过删除这段代码并再次绘制,我得到了这个图:
它比我的第一个数字好一点(例如,黄色轮廓像橙色轮廓一样完全填充)。但我不知道重叠的优先级是如何实现的。我必须查看更多的来源
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浅黄色区域也有轮廓线,它们覆盖在所有其他轮廓之上。
例如,你可以在这两个图上看到黄色1C.L不是真正的纯黄色。2 C.L黄色也有同样的问题,它不是真正的浅黄色。
现在,我必须:
-
寻找如何为1 C.L和2 C.L(而不仅仅是2 C.L置信水平)设置轮廓
-
将透明度应用于所有其他下方轮廓的轮廓线,并保持纯黄色1 C.L和浅黄色2 C.L的完整性。注意,我想要的是轮廓线上的透明度,而不是颜色本身的透明度。
我承认这有点棘手,但我认为这是可能的(
getdist
,我必须搜索必要的选项,或者能够
找到一种方法,在不混合每种颜色的所有透明度的情况下,通过重叠来实现这种排序。