Pythonで時系列変化する散布図+棒グラフ を同時に描きたい(コードつき)
目次
この記事を読んでわかること
こういう散布図 with 棒グラフを描くpythonスクリプト

左はサンプル点、右は重み
赤はground truth. 薄い青は若いindex番号, 濃い青は大きいindex番号
サンプル点と重みの色には対応関係がある
こんなグラフは何の役に立つのだろう??
役に立つのはこんな状況かな?
- 散布図で情報を表現したいとき。つまり、空間座標の情報が意味を持つ時
- 散布図が時間と共に変化していくとき。
- 散布図の変化はなんらかのパラメタに影響を受けているとき。
思いつく例だと、遺伝アルゴリズムの可視化に使えると思う。
コード
技術スタック
散布図の点を連続値で色塗りする
matplotplibのscatterメソッドの標準装備。
seabornパッケージのscatterにはこの機能がなかった。残念!
散布図でデフォルトと別の色を持つ点を描写したい
要するに図の赤点を描写したい。このために、プロット命令を複数実行する、と考えればいい。
プロット命令を同じレイヤーに対して複数実行すると、レイヤーに上書きされるからだ。
中央にタイトルを記載する
numpyのスライシングを可変にする
tensor中の最小値・最大値を求めたい。しかも、3次元目のxだけを指定して最小・最大を求めたい。
ハードコードで多次元配列にアクセスする手段もあるが・・・関数化して処理を使いまわししたかった。
そこで、こんなやり方を発見
matplotlib barの色を連続値にする
棒グラフのbarメソッドには、色を連続値で表示するための自動計算機能がない。棒グラフってもともと離散値を表示するためのものだから、とても当たり前のこと。
barメソッドにはリストで色を指定して与える必要がある。でも、ぼくはどうしても連続値で色付けしたかった。
そこで、色コードを生成して、色コードをリストに詰める。
1 2 3 4 |
# generating colors norm = matplotlib.colors.Normalize(vmin=df_weight.index.min(), vmax=df_weight.index.max()) cmap = matplotlib.cm.ScalarMappable(norm=norm, cmap=matplotlib.cm.Blues) colors = [cmap.to_rgba(i + 1) for i in df_weight.index] |
この記事を書こうとおもったきっかけ
前回はこんなグラフを作った。前回のグラフではまた不足になってしまった。
さらに重みの表示が必要になった。なぜなら、最適化は重みの方向に進んでいくから。
重みの表示をすると、サンプル点と重みの対応関係をなんらかの情報を表示したくなる。その結果、カラーバーを使うことにしてみた。
カラーバーでは厳密にサンプル点と重みの対応関係を得ることができないが・・それでもないよりはマシ。
グラフが進化していくね(にっこり)
ディスカッション
コメント一覧
まだ、コメントがありません