📊

【python】seabornで系列数が多い時にハイライト表示したグラフが描けるライブラリを作りました

2023/01/15に公開

2023.10.01 更新

より使いやすく修正したものを公開しています。最新版はこちらの記事をご覧ください。

https://zenn.dev/shiro46/articles/42c79863658b63

概要

pythonでグラフを描くとき、私はよくseabornを使っています。
seabornではhueを指定するだけでプロットの色を系列ごとに変えられて、簡単に見た目の整ったグラフを作ることができます🙌
ただし、系列が増えすぎると次のような課題が出てきます。

  • 同じ色/近い色 の区別ができない
  • 注目したい系列が目立たない


色が多くなり、パッと見て注目ポイントがわからない図

今回は、系列が多いときに一部の系列のみカラー表示とすることで、注目したい系列をハイライトさせるライブラリを作成しました。

2色(+灰色)にすることで、注目したいポイントが目立つようになった図

使い方

インストール、インポートの方法はリポジトリに説明を置いているのでそちらをご確認ください。
https://github.com/shiro46mt/shiroplot

後は seabornでグラフを描く時と同じ要領で使用できます。
実行時の違いは highlightsにハイライトしたい項目を渡す という点のみです。

import seaborn as sns
df = sns.load_dataset('healthexp')

# 通常の場合 (seaborn)
sns.lineplot(data=df, x='Year', y='Life_Expectancy', hue='Country')

# ハイライトする場合 (shiroplot)
import shiroplot as splt
splt.lineplot(data=df, x='Year', y='Life_Expectancy', hue='Country',
	highlights=['Japan', 'USA']) # <- この引数を追加

実装

やっていることは単純で、hueを指定せずに1色でプロットした上に、ハイライトしたいデータだけをhue指定ありで重ね書きしています。

sns.histplotだけ、そのままやるとbin幅がずれることがあるので、指定がなければbins=10を追加で指定するようにしています。
https://github.com/shiro46mt/shiroplot/blob/main/shiroplot/highlightplot.py

なお、現時点で対応しているのは以下3点のみです。

  • sns.scatterplot
  • sns.lineplot
  • sns.histplot

その他はsns.histplotと同様の課題が生じるのですが、汎用的な対処方法が思いついていないため保留にしています。必要になった時に追加します。

あとがき

はじめての自作ライブラリ開発でした。
自分が書いたコードを人に見せる機会がほとんどないので、もしも「こうしたらもっと簡単に実装できるよ」など改善点があればコメントで教えていただけると泣いて喜びます。

今回やらなかったけど、今後は以下の内容も挑戦してみたいです。

  • PyPIに登録
  • テストの自動化

参考にした記事

Rの同様のパッケージ「gghighlight」
https://notchained.hatenablog.com/entry/2017/09/29/212444

Pythonでライブラリを作る方法
https://zenn.dev/karaage0703/articles/db8c663640c68b

自作OSSの公開にあたって (これをみてREADMEがんばった)
https://zenn.dev/kato_shinya/articles/why-your-packages-are-not-popular

Discussion