微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Matplotlib-Python- GetDist工具-通过调用两次plot函数来重叠2个三角图三边形:两者之间的可见优先级问题

python3中,使用工具Getdist tool to produce triplot of covariance matrix遇到2个问题。

1)目前,我只需调用一次绘图函数triangle_plot)就可以在同一图形上绘制2个协方差矩阵。将要绘制的协方差矩阵列表指定为第一个输入就足以使每个矩阵具有(1 sigma,2 sigma)轮廓。这里是由2个协方差矩阵(填充区域对应于1 sigma置信度(68%)并阴影为2 sigma C.L(95%))产生的三重图的示例。颜色标识每个矩阵(此处为红色和蓝色):

contours 1 sigma and 2 sigma of each matrix

我的主要目标是,我想像这样按降序排列优先重叠:

1) 1 sigma blue disk of smallest ellipse (blue)
2) 1 sigma red disk of largest ellipse (red)
3) 2 sigma blue disk of smallest ellipse (shaded blue)
4) 2 sigma red disk of smallest ellipse (shaded red)

认行为下,我具有以下降序优先级:

1) 1 sigma blue disk of smallest ellipse (blue)
2) 2 sigma blue disk of smallest ellipse (shaded blue)
2) 1 sigma red disk of largest ellipse (red)
4) 2 sigma red disk of smallest ellipse (shaded red)

以下是在上面产生此图的脚本:

g.triangle_plot([matrix1,matrix2],names,filled = True,legend_labels = ['1240','1560'],legend_loc = 'upper right',contour_colors = ['red','darkblue'],line_args = [{'lw':2,'color':'red'},{'lw':2,'color':'darkblue'}],)

最后,我只希望那个1 sigma红色磁盘不要被2 sigma蓝色阴影隐藏。

以下是我想要的示例(警告,与上面的三脚架相比,红色和蓝色之间存在倒置):

example of wanted overlap

不在乎黄色轮廓。如您所见,1 sigma蓝色磁盘的优先级高于2色红色阴影sigma磁盘。这与我想要的行为完全一样。

在我上面的三重奏中,我尝试了很多使用alpha参数的操作,但是由于颜色混合且不再与图例(红色和蓝色)相对应,这很混乱。

2)鉴于我没有发现在Getdist的源中更改此优先级,我尝试用一​​个矩阵调用两次函数triangle_plot每次通话。

但是不幸的是,在两次调用之后,两次绘图没有重叠。仅出现一个彩色三色图(最后一次调用)。例如,如果我这样进行这两个连续的调用matrix 2代表最大的红色椭圆,matrix1代表最小的椭圆):

g.triangle_plot([matrix2],legend_labels = ['1560'],contour_colors = ['darkblue'],contours = 0,num_plot_contours = 0,'color':'darkblue'}]
                )

g.triangle_plot([matrix1],legend_labels = ['1240'],contour_colors = ['red'],contours = 1,num_plot_contours = 1,'color':'red'}]
                )

是否可以保留第一个三脚架(矩阵2以红色表示)并再次调用triangle_plot函数以在该第一个三脚架上重叠第二个三脚架(蓝色)?

实际上,这将使我能够使用置信度级别(C.L:68%或95%)的标识符,然后解决此优先级问题。

不幸的是,当我两次调用triangle_plot函数时,重叠不起作用:仅保留了最后一个调用,第一个似乎已从图中删除

有什么方法可以在这种三线图上强制重叠(重叠轮廓,但不重叠标签和刻度线)?我们可以认为先验是简单的,因为三级图只是盒子/子图),但我不能仅仅设法完成这种重叠。我试图在两个调用之间插入:

plt.show(block=False)  # do not block

但这不起作用。我认为这是由于我将图形保存在文件末尾的原因:

# Save figure
g.fig.savefig('Comparison_Overlap.pdf')

更新1

感谢Stef。只是最后一个问题:轮廓和填充区域隐藏了水平和垂直xticks,我不知道后者是zorder。这里有两个示例说明了这个问题:

first example of xticks masked

您会看到对应于0.95的xtick被屏蔽了。

second example of xticks masked

您会看到右下角的xtick也被遮盖了。

更新2

@Stef的求解效果很好,但仍然存在一个小问题:轮廓线隐藏了xticks和yticks。

认情况下,xticks的z-order由下式给出:

g.fig.axes[0].xaxis.get_major_ticks()[0].zorder

返回:0

所以,当我绘制轮廓时,我会放在triangle_plot之后:

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,[-1.7,-1.5,-0.1,-1.6,-1.4,-0.1]):
      c.zorder = z

这样,我可以使轮廓不被轮廓隐藏。例如,如下所示:

xtick no hidden

解决方案不是很容易,因为我必须处理负值([-1.7,-0.1])。

现在,感谢@Stef,我可以通过执行以下操作来修改此值g.fig.axes[0].xaxis.get_major_ticks()[0].zorder,例如等于3

# Modify z-order 
for mt in g.fig.axes[0].xaxis.get_major_ticks():
  mt.zorder = 3
for mt in g.fig.axes[0].yaxis.get_major_ticks():
  mt.zorder = 3

但是,如果我只是在那之后做:

for ax in g.fig.axes:
  geo = ax.get_geometry()
  if (geo[2]-1) // geo[0] > (geo[2]-1) % geo[0]:
    for c,[1.6,1.8,2,1.7,1.9,2]):
      c.zorder = z

xticks保持轮廓隐藏,而将阈值设置为3:我不了解这种行为:

xtick hidden

怎么了?

更新3

这是我最后要解决的有关我想要在刻度上的优先级的问题,即使xticks / yticks出现在轮廓的前面,而不是瞬间出现的相反。

如果我在认情况下打印zorderget_major_ticks()的{​​{1}}值,则会得到:

get_ticklines()[0])

==>

print('zorder1 = ',g.fig.axes[0].xaxis.get_major_ticks()[0].zorder)
print('zorder2 = ',g.fig.axes[0].xaxis.get_ticklines()[0].zorder)

zorder1 = 0 zorder2 = 2.01 get_major_ticks()有什么区别?

您可以理解为什么我可以设法在所有轮廓前面设置刻度线,即在get_ticklines()给出的解中设置负值:

@Stef

我可以通过输入以下内容修改上面的for ax in g.fig.axes: geo = ax.get_geometry() if (geo[2]-1) // geo[0] > (geo[2]-1) % geo[0]: for c,-0.1]): c.zorder = z

zorder2

但是我无法修改g.fig.axes[0].tick_params(zorder=3) 认情况下等于zorder1)。

如何更改0的这个0值(它引用了zorder1)?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐