【问题标题】:Matplotlib_Venn, Multiple Venn diagrams same scaleMatplotlib_Venn,多个维恩图相同比例
【发布时间】:2015-12-09 16:25:10
【问题描述】:

我目前有一个带有 5 个维恩图子图的图形。所有 5 个图都是 2 个圆形 venns,每个图都有不同的元素总和。Refer to this figure

我想知道是否可以将这 6 个子图都设置为相同的比例?例如,我的整个第一个 venn 将被缩放为小于第五个。

代码如下。 非常感谢任何帮助。

from matplotlib_venn import venn2
from matplotlib import pyplot as plt
import numpy as np

figure, axes = plt.subplots(2, 3, figsize=(11.69,8.27))


BSL_20=(313,10,76)
BSL_40=(384,17,150)
BSL_100=(665,8,378)
BSL_100CC=(860,23,879)
BSL_200=(585,17,758)

v1=venn2(BSL_20, set_labels = ('150mm at 50%', '400mm at 25%'), ax=axes[0][0])
v2=venn2(BSL_40, set_labels = ('150mm at 50%', '400mm at 25%'), ax=axes[0][1])
v3=venn2(BSL_100, set_labels = ('150mm at 50%', '400mm at 25%'), ax=axes[0][2])
v4=venn2(BSL_100CC, set_labels = ('150mm at 50%', '400mm at 25%'), ax=axes[1][0])
v5=venn2(BSL_200, set_labels = ('150mm at 50%', '400mm at 25%'), ax=axes[1][1])
v6=venn2(BSL_200, set_labels = ('150mm at 50%', '400mm at 25%'), ax=axes[1][1])
axes[1,2].axis('off')

plt.show()

【问题讨论】:

    标签: python matplotlib venn-diagram matplotlib-venn


    【解决方案1】:

    尝试在plt.show() 之前将其添加到您的代码中:

    from matplotlib.cbook import flatten
    
    data = [BSL_20, BSL_40, BSL_100, BSL_100CC, BSL_200]
    max_area = max(map(sum, data))
    
    def set_venn_scale(ax, true_area, reference_area=max_area):
        s = np.sqrt(float(reference_area)/true_area)
        ax.set_xlim(-s, s)
        ax.set_ylim(-s, s)
    
    for a, d in zip(flatten(axes), data):
        set_venn_scale(a, sum(d))
    

    解释:

    • matplotlib_venn 绘制的补丁被缩放,因此它们的总面积为 1。图表的中心位于点 (0, 0) 附近,并配置了轴限制,以便图表可以紧紧地贴在里面。
    • 这意味着,如果您简单地为所有子图设置 xlim(-1, 1)ylim(-1, 1),您将获得总面积相同的图表(假设所有子图以相同的比例显示)。
    • 如果您现在需要“缩小”其中一个图表以将其面积缩小 2,实现此目的的一种方法是将所有轴限制放大sqrt(2)
    • 上面的代码就是这样做的:它首先识别出实际总面积最大的圆集,然后简单地将其他图表的限制按比例扩大到sqrt(max_area/required_area)

    您还可以在 Y 轴上减少一些松弛,并将代码和图表更紧密地打包如下:

    from matplotlib_venn import venn2
    from matplotlib.cbook import flatten
    from matplotlib import pyplot as plt
    import numpy as np
    
    figure, axes = plt.subplots(2, 3, figsize=(11.69,5.5))
    
    BSL_20=(313,10,76)
    BSL_40=(384,17,150)
    BSL_100=(665,8,378)
    BSL_100CC=(860,23,879)
    BSL_200=(585,17,758)
    
    data = [BSL_20, BSL_40, BSL_100, BSL_100CC, BSL_200]
    max_area = max(map(sum, data))
    
    def set_venn_scale(vd, ax, true_area, reference_area=max_area):
        sx = np.sqrt(float(reference_area)/true_area)
        sy = max(vd.radii)*1.3
        ax.set_xlim(-sx, sx)
        ax.set_ylim(-sy, sy)
    
    for a, d in zip(flatten(axes), data):
        vd = venn2(d, set_labels = ('150mm at 50%', '400mm at 25%'), ax=a)
        set_venn_scale(vd, a, sum(d))
    
    axes[1,2].axis('off')
    figure.tight_layout(pad=0.1)
    plt.show()
    

    但请注意,如果tight_layout 感觉空间不足,它将开始重新缩放您的子图,因此请检查结果(例如,通过 ax.set_axis_on() 在子图周围添加轴,并确保所有子图具有相同的宽度)。

    【讨论】:

    • 感谢您提供有用且解释清楚的回复,非常有效!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    相关资源
    最近更新 更多