[解決済み] Matplotlib の離散カラーバー
2022-08-27 11:18:28
質問
matplotlibで散布図に不連続なカラーバーを作ろうとしています。
x, y データがあり、各点に一意の色で表現したい整数のタグ値があります。
plt.scatter(x, y, c=tag)
通常、タグは0から20までの整数になりますが、正確な範囲は変更される可能性があります。
これまでのところ、私はデフォルトの設定を使っています。
plt.colorbar()
これは色の連続的な範囲を与えるものです。理想的には、n個の離散的な色のセット(この例ではn=20)が必要です。さらに良いのは、タグの値が0で灰色になり、1〜20でカラフルになることです。
いくつかの「クックブック」スクリプトを見つけましたが、非常に複雑で、一見単純に見える問題を解決する正しい方法とは思えません。
どのように解決するのですか?
散布図の正規化として BoundaryNorm を使用することで、非常に簡単にカスタム離散カラーバーを作成することができます。風変わりなビット (私の方法では) は、0 を灰色として表示することです。
画像については、私はしばしばcmap.set_bad()を使用し、データをnumpyのマスクされた配列に変換します。それは0をグレーにするためにはるかに簡単ですが、私はこれをスキャッタまたはカスタムcmapで動作させることができませんでした。
別の方法として、ゼロから独自のcmapを作成するか、既存のものを読み出していくつかの特定のエントリだけをオーバーライドすることができます。
import numpy as np
import matplotlib as mpl
import matplotlib.pylab as plt
fig, ax = plt.subplots(1, 1, figsize=(6, 6)) # setup the plot
x = np.random.rand(20) # define the data
y = np.random.rand(20) # define the data
tag = np.random.randint(0, 20, 20)
tag[10:12] = 0 # make sure there are some 0 values to show up as grey
cmap = plt.cm.jet # define the colormap
# extract all colors from the .jet map
cmaplist = [cmap(i) for i in range(cmap.N)]
# force the first color entry to be grey
cmaplist[0] = (.5, .5, .5, 1.0)
# create the new map
cmap = mpl.colors.LinearSegmentedColormap.from_list(
'Custom cmap', cmaplist, cmap.N)
# define the bins and normalize
bounds = np.linspace(0, 20, 21)
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
# make the scatter
scat = ax.scatter(x, y, c=tag, s=np.random.randint(100, 500, 20),
cmap=cmap, norm=norm)
# create a second axes for the colorbar
ax2 = fig.add_axes([0.95, 0.1, 0.03, 0.8])
cb = plt.colorbar.ColorbarBase(ax2, cmap=cmap, norm=norm,
spacing='proportional', ticks=bounds, boundaries=bounds, format='%1i')
ax.set_title('Well defined discrete colors')
ax2.set_ylabel('Very custom cbar [-]', size=12)
<イグ
私は個人的に、20種類の色があると、特定の値を読み取るのが少し難しくなると思っています。
関連
-
[解決済み] Matplotlibで、fig.add_subplot(111)の引数はどういう意味ですか?
-
[解決済み] Matplotlibでプロットを表示するのではなく、画像ファイルに保存する。
-
[解決済み] IPythonノートブックmatplotlibプロットをインラインで行う方法
-
[解決済み】Matplotlibで図のタイトルと軸ラベルのフォントサイズを設定するには?
-
[解決済み] matplotlib のプロットでフォントサイズを変更する方法
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] pandasのDataFrameから空のセルを含む行を削除する
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] 小数点以下1桁を取得する[重複]。
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] Pythonの検索パスを他のソースに展開する
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する