在同一角度图中绘制多个数据集

3
我想知道是否可以使用Corner plot同时绘制多个数据集。请不要建议使用Seaborn的pairplot。
以下为文档中的简单Corner plot脚本:
import corner
import numpy as np

ndim, nsamples = 2, 10000
np.random.seed(42)
samples = np.random.randn(ndim * nsamples).reshape([nsamples, ndim])
figure = corner.corner(samples)

结果如下图所示: enter image description here

现在,我想在上面的这三张图片之上绘制第二个数据集,也许使用不同的颜色。有办法做到吗?

2个回答

4

是的,这就是方法:

figure = corner.corner(samples)
corner.corner(samples2,fig=figure)

如何抑制第一次调用 corner.corner() 的绘图? - jtlz2

0
以下是一些代码,用于在一个角落图中叠加多个样本集,并带有图例。

enter image description here

# -*- coding: utf-8 -*-
"""Demo to overlay multiple corners on top of each other"""
import corner
import matplotlib.lines as mlines
import matplotlib.pyplot as plt
import numpy as np

CORNER_KWARGS = dict(
    smooth=0.9,
    label_kwargs=dict(fontsize=16),
    title_kwargs=dict(fontsize=16),
    quantiles=[0.16, 0.84],
    levels=(1 - np.exp(-0.5), 1 - np.exp(-2), 1 - np.exp(-9 / 2.)),
    plot_density=False,
    plot_datapoints=False,
    fill_contours=True,
    show_titles=True,
    max_n_ticks=3,
)


def overlaid_corner(samples_list, sample_labels):
    """Plots multiple corners on top of each other"""
    # get some constants
    n = len(samples_list)
    _, ndim = samples_list[0].shape
    max_len = max([len(s) for s in samples_list])
    cmap = plt.cm.get_cmap('gist_rainbow', n)
    colors = [cmap(i) for i in range(n)]

    plot_range = []
    for dim in range(ndim):
        plot_range.append(
            [
                min([min(samples_list[i].T[dim]) for i in range(n)]),
                max([max(samples_list[i].T[dim]) for i in range(n)]),
            ]
        )

    CORNER_KWARGS.update(range=plot_range)

    fig = corner.corner(
        samples_list[0],
        color=colors[0],
        **CORNER_KWARGS
    )

    for idx in range(1, n):
        fig = corner.corner(
            samples_list[idx],
            fig=fig,
            weights=get_normalisation_weight(len(samples_list[idx]), max_len),
            color=colors[idx],
            **CORNER_KWARGS
        )

    plt.legend(
        handles=[
            mlines.Line2D([], [], color=colors[i], label=sample_labels[i])
            for i in range(n)
        ],
        fontsize=20, frameon=False,
        bbox_to_anchor=(1, ndim), loc="upper right"
    )
    plt.savefig("corner.png")
    plt.close()


def get_normalisation_weight(len_current_samples, len_of_longest_samples):
    return np.ones(len_current_samples) * (len_of_longest_samples / len_current_samples)


def main():
    ndim, nsamples = 3, 10000
    samples = np.random.randn(ndim * nsamples).reshape([nsamples, ndim])

    overlaid_corner(
        [samples * 3, samples * 2, samples],
        ["samples x 3", "samples x 2", "samples"]
    )


if __name__ == "__main__":
    main()



但它不能正确地为第一个样本缩放1D直方图! - deltasata
@deltasata,不确定你的意思?你有例子吗? - Avi Vajpeyi
抱歉,我的评论不够清晰。在这里我关心的是一维直方图的正确性(和外观)。在这个例子中,为什么第一个样本没有相对于max_len加权?无论如何,在这里加权等同于在corner.corner()中使用hist_kwargs=dict(density=True)。然而,我发现在任何情况下都存在一个错误。每次绘制样本的直方图后,1D直方图的y轴范围都会被重置。因此,如果您不在最后绘制具有最高直方图的样本,则会看到它超出范围!尝试传递不是最后一个的样本!这一定是一个错误。 - deltasata

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