散布図をプロットするには、matplotlib を使用します。
そして、 matplotlibのヒントに従って、透明なボックスを使用してバブルにラベルを付けます。
コードは次のとおりです。
if show_annote:
for i in range(len(x)):
annote_text = annotes[i][0][0] # STK_ID
ax.annotate(annote_text, xy=(x[i], y[i]), xytext=(-10,3),
textcoords='offset points', ha='center', va='bottom',
bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.2),
fontproperties=ANNOTE_FONT)
そして結果のプロット:
ただし、オーバーラップを減らすにはまだ改善の余地があります (たとえば、ラベル ボックスのオフセットは (-10,3) に固定されています)。次のことができるアルゴリズムはありますか?
- 近隣の混み具合に応じて、ラベル ボックスのオフセットを動的に変更する
- ラベル ボックスをリモートで動的に配置し、バブルとラベル ボックスの間に矢印線を追加する
- ラベルの向きを多少変更する
- label_box オーバーラップ バブルは、label_box オーバーラップ label_box よりも優れていますか?
人間の目でグラフを簡単に理解できるようにしたいだけなので、一部の重複は問題ありません。また、チャート内のバブルの量は、ほとんどの場合 150 未満です。
いわゆるForce-based label placement
http://bl.ocks.org/MoritzStefaner/1377729 は非常に興味深いものです。アルゴリズムを実装するために利用できる Python コード/パッケージがあるかどうかはわかりません。
私は学者ではなく、最適な解決策を探していません。私のpythonコードは多くのチャートにラベルを付ける必要があるため、速度/メモリは考慮の範囲内です.
迅速かつ効果的な解決策を探しています。この件に関するヘルプ (コード、アルゴリズム、ヒント、考え) はありますか? ありがとう。