Pythonでupsetplotを使う
TL;DR
集合関係の包含関係を示す際、2つや3つならベン図がわかりやすいですが、集合関係の数が増えてくるとベン図だと理解しにくくなることがあります。そこで便利なのが、Alexander Lexが2014年に提唱したUpSetPlotです。Pythonで利用する場合は以下のパッケージが定期的にメンテされており安心です(2021/8現在)
Rでの実装例はこちらのサイトを参考にしてください。
upset plotとベン図
まず、ベン図とUpset Plotが比較されている図を見てみます。
図1. venn図とupsetplot(Lex et al., 2014 Fig. 4)
3つくらいだと一長一短という感じです。集合の量的関係を見る文にはUpset Plotのほうが向いていそうです。
また、upsetplotのメリットは、拡張性が高いということです。というのは、集合関係を行で表しているため、その行に別のデータを挿入できます。例えば以下のように拡張できます。
図2. upsetplotの拡張性(Lex et al., 2014 Fig. 1)
また、集合間の量的関係を表すため、集合に属する数によってソートをかけるといったことも可能です。もちろん、拡張したデータに対してソートできます。
図3. upsetplotのソート(Lex et al., 2014 Fig. 6)
Pythonによる実装
Install
サンプルデータの生成
upsetplotパッケージはサンプルデータを生成できるので、まずはサンプルデータで試してみます。
基本的なUpset PlotとVenn図の描画
venn図
サンプルデータを使ってベン図を作成します。ベン図の作成には、matplotlibのvenn3を使用します。
出力

量が歪だと少しわかりにくいです。
Upset Plot
サンプルデータを使って、同様にUpset Plotを作成します。
出力

量的関係と集合関係を分離させることで、量的関係の視覚的な理解が容易くなっています。逆に集合関係は少し理解が難しくなります。
向きを変えたり、ソートしたりも簡単にできます。


Upset Plotの拡張
scikit-learnに登録されているbostonの住宅データを使ってupsetplotの拡張を試してみましょう。
scikit-learnがない場合はインストールします。またデータ操作にpandasを使うのでpandasもインストールします。
拡張にはUpSetクラスを作成し、add_catplotメソッドを使用します。

カテゴリのリストからUpset Plotを作成する
実際のデータ(RNA-seqの発現変動遺伝子etc.,)などでは、カテゴリ列から集合関係を作成する事が多いです。そのため、カテゴリが含まれる集合からUpset Plotを作成する方法につていも記載しておきます。
カテゴリの集合をそれぞれcategory_nとして、3つのカテゴリの集合についてUpset Plotを作成します。

慣れてしまえばデータフレーム操作は簡単ですが、最初結構戸惑ったのでメモ代わりに残しておきます。最初にTrueで初期化するのが重要です。
Reference
- upsetplot Documentation
- Alexander Lex, Nils Gehlenborg, Hendrik Strobelt, Romain Vuillemot, Hanspeter Pfister,UpSet: Visual-ization of Intersecting Sets, IEEE Transactions on Visualization and Computer Graphics (InfoVis ‘14), vol.20, no. 12, pp. 1983–1992, 2014. doi: doi.org/10.1109/TVCG.2014.2346248