在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%))产生的三重图的示例。颜色标识每个矩阵(此处为红色和蓝色):
我的主要目标是,我想像这样按降序排列优先重叠:
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蓝色阴影隐藏。
以下是我想要的示例(警告,与上面的三脚架相比,红色和蓝色之间存在倒置):
不在乎黄色轮廓。如您所见,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
。这里有两个示例说明了这个问题:
您会看到对应于0.95的xtick被屏蔽了。
您会看到右下角的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
这样,我可以使轮廓不被轮廓隐藏。例如,如下所示:
此解决方案不是很容易,因为我必须处理负值([-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
:我不了解这种行为:
怎么了?
更新3
这是我最后要解决的有关我想要在刻度上的优先级的问题,即使xticks / yticks出现在轮廓的前面,而不是瞬间出现的相反。
如果我在默认情况下打印zorder
和get_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 举报,一经查实,本站将立刻删除。