3

現在、5 つのベン図サブプロットを含む図があります。5 つの図はすべて 2 つの円ベンであり、それぞれ要素の合計が異なります。この図を参照してください

これらの 6 つのサブプロットをすべて同じ縮尺にすることが可能かどうかを知りたいですか? たとえば、最初の venn 全体が 5 番目の 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()
4

1 に答える 1

4

前にこれをコードに追加してみてください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 だけ減らすために図の 1 つを "縮小" する必要がある場合、それを達成する 1 つの方法は、すべての軸の範囲を だけ拡大することです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()すべてのサブプロットの幅が同じであることを確認します)。

于 2015-12-10T14:18:10.330 に答える