Pythonで時系列変化する散布図+棒グラフ を同時に描きたい(コードつき)

A8バナー広告

この記事を読んでわかること

こういう with 棒グラフを描くスクリプト


左はサンプル点、右は重み
赤はground truth. 薄い青は若いindex番号, 濃い青は大きいindex番号
サンプル点と重みの色には対応関係がある

こんなグラフは何の役に立つのだろう??

役に立つのはこんな状況かな?

  • 散布図で情報を表現したいとき。つまり、空間座標の情報が意味を持つ時
  • 散布図が時間と共に変化していくとき。
  • 散布図の変化はなんらかのパラメタに影響を受けているとき。

思いつく例だと、遺伝アルゴリズムの可視化に使えると思う。

コード

技術スタック

散布図の点を連続値で色塗りする

matplotplibのscatterメソッドの標準装備。

パッケージのscatterにはこの機能がなかった。残念!

散布図でデフォルトと別の色を持つ点を描写したい

要するに図の赤点を描写したい。このために、プロット命令を複数実行する、と考えればいい。

プロット命令を同じレイヤーに対して複数実行すると、レイヤーに上書きされるからだ。

中央にタイトルを記載する

numpyのスライシングを可変にする

tensor中の最小値・最大値を求めたい。しかも、3次元目のxだけを指定して最小・最大を求めたい。

ハードコードで多次元配列にアクセスする手段もあるが・・・関数化して処理を使いまわししたかった。

そこで、こんなやり方を発見

barの色を連続値にする

棒グラフのbarメソッドには、色を連続値で表示するための自動計算機能がない。棒グラフってもともと離散値を表示するためのものだから、とても当たり前のこと。

barメソッドにはリストで色を指定して与える必要がある。でも、ぼくはどうしても連続値で色付けしたかった。

そこで、色コードを生成して、色コードをリストに詰める。

この記事を書こうとおもったきっかけ

前回はこんなグラフを作った。前回のグラフではまた不足になってしまった。

さらに重みの表示が必要になった。なぜなら、は重みの方向に進んでいくから。

重みの表示をすると、サンプル点と重みの対応関係をなんらかの情報を表示したくなる。その結果、カラーバーを使うことにしてみた。

カラーバーでは厳密にサンプル点と重みの対応関係を得ることができないが・・それでもないよりはマシ。

グラフが進化していくね(にっこり)