環境 macOS mojave 10.14.4; Python 3.7.3; 2次元カラーマップを書いていて,カラーバーの範囲が思うように出なくて困りました. こんな図が欲しいのに, Pythonでグラフを描く時、Matplotlibを使うと思います。 また最近はSeabornというグラフを綺麗にしてくれるライブラリがあり、自分はそれを愛用しています。 ただ、色をもっと自由に選びたい、設定したいという時に+αでColormapのカスタマ … Matplotlib has a number of built-in colormaps accessible via matplotlib.cm.get_cmap. カラーマップはplt.get_cmap()で取得します。取得したカラーマップに数値(0.0 ~ 1.0)を渡すことで、そのカラーマップ内の色を使うことができます。 demo.py. - AxesオブジェクトにはAxisオブジェクトが属している, この階層構造を知っていると前述したシンプルな例で最初にやっていることの意味が理解できます5。, 試しに何もプロットせずにFigureとAxesのみを作って、それぞれの関係を示す属性をprintで表示して見ます。, ここからわかるのは以下の関係です。AxesSubplotはplt.subplotsで作った場合のAxesオブジェクトと思って問題ありません。, 執筆時の最新版2.1.1の Tutorials > Introductory > Usage Guide には、階層構造の代わりにグラフの構成要素を細かく示した"解剖図"6が掲載されています7。これを見ると「この、なに、軸?枠?」の部分はSpinesと呼ばれていることがわかります。, データを示す線や点、x軸やy軸、描画領域を表す枠や文字などグラフに表示される全ての要素はArtistと呼ばれます。Artistはcontainer(容器)とprimitive(原始的なものという意味)の二種類に分類されます。先の階層構造で示したFigure、Axes、Axisはcontainerに、プロットの線(Line2D)や点(PathCollection)あるいは文字(Text)はprimitiveに相当します。解剖図にあるtickやlabelは名前こそ違いますが実体はLine2DとTextオブジェクトです。これらの関係を簡単に図示すると以下のようになります。各primitiveを生成するAxesメソッドの例を右側に示しました。, 前項のサンプルコードの結果を見るとわかりますが、Axisは実際にはXAxisとYAxisという名前です。Axisの下にはさらTickという目盛り関連の線や文字のためのcontainerがあります。containerはその名の通りprimitiveを入れる箱を持っています。このとき、containerの階層構造にあった「一つしか持てない」という制限はなく、いくつでもおなじprimitiveを持つことができます。例えば何もプロットしていないaxでLine2Dオブジェクトを入れる箱ax.linesを見ると空リストが表示されます。ax.plotは他の細々した設定とともにこのリストにLine2Dオブジェクトを追加していきます。, ほかのcontainerでも同じですがFigureに属するArtistはそれぞれに対応する箱に入っていると考えるとよいです。箱は属性(attribute)を呼ぶことで中身を見れます。, fig.axesだけは意味合いが若干異なりますが、属性名が単数形だと一つだけ、複数形だとリストになっていることがわかります。これはこの後の例でも同じです。上の表にわざわざ「Figureに属する」と書いたのには理由があります。グラフに図形やテキストなどのArtistを追加するときに、Figureに追加するかAxesに追加するかによって座標の原点が異なるからです。どちらを使うのが適切かはやりたいことや実装の方法によって変わるでしょう。, ところで、fig.legendsはfig.legendメソッドによって追加された凡例を入れる箱です。「ax.legendがあるじゃん」と思いますよね。凡例を追加する際によく使われるax.legendメソッドは、そのaxに所属するArtistからしか凡例を作ってくれません。一方、fig.legendメソッドは所属する全てのAxesのArtistから凡例をかき集めて一括表示してくれます。例えば左右の軸に異なるスケールのプロットをした時に素直にax.legendを使うと凡例が二つできていしまいます。ちなみにc='C1'についてはこちらを参照してください。, これは多くの場合望ましくはないでしょう。凡例を一つにまとめるには、最後のax.legend()の代わりに、axとax1の凡例のhandlerとlabelのリストを結合してax.legendに渡すという有名な解決法があります。, 実は、ver 2.1からは引数なしのfig.legendメソッドを使ってhandlerやlabelを気にせずもっとシンプルに書けるようになっています8。デフォルトではFigureの座標が使われますが、凡例の配置はAxes座標ベースの方が都合の良い場合が多いです。下の例のようにbbox_transformオプションを使うとaxに対する座標系に変更できます。, グラフの見た目の調整はAxesとその下のAxisとTickが主な舞台です。これらについて例を挙げながら述べます。以下はAxesがArtistを保持する箱です。「Axesに属する」のは自明なので省略しました。, プロットしたり二次元データを描画する際に使うax.plotやax.imshowなどは、これらのcontainerに対応するオブジェクトを追加すると同時にいろいろな処理も一緒にしてくれるヘルパーメソッドと呼ばれてます。主なプロット関連のヘルパーメソッドは以下です。, 以下の例ではax.plotとax.scatterでLine2DオブジェクトとPathCollectionオブジェクトが対応したリストに追加される様子がわかります。, 「プロットで生成されたオブジェクトはリストに追加される」ということを知ると、「あるAxesでプロットしたLine2Dオブジェクトを他のAxesのlines属性に追加すればプロット(線)を使いまわせるのかな?」と思いがちですが、これはArtist tutorialの Axes container の項目でわざわざ明記されている通りやるべきではありません。ax.plotはax.linesにLine2Dオブジェクトを追加する他にもいろいろとやっているからです。試しにやってみてもうまく表示されません。, また、Line2DをAxesに追加する際に必要な設定をいろいろやってくれるAxes.add_lineというメソッドを試してみるとエラーになります。, このエラーメッセージから、おそらく一度どれかのcontainerに格納されたArtistを他のcontainerに使い回すことはできないのだろうことが予想されます。これはFigureとAxesとAxisの階層構造のところで調べた上下関係とも矛盾しませんし、各Artistには所属するcontainerが属性として登録(紐付け)されていることとも合致します。, この辺を全てクリアできるなら使いまわしも可能でしょうが、当初の「リストに追加すればよい?」という思いつきの手順からは相当逸脱するので避けるのが妥当でしょう。, AxisはAxesほどいろんなものを描画する必要がないので、軸のラベルの文字とtick関連の情報程度しか持っていません。しかし、デフォルトのままでは微調整したくなる見た目であることが多いわりに、細かい設定の仕方がわかりにくいグラフのパーツの代表格とも言ってよいでしょう。この説明を読むといろいろなレシピの理解がいくらか深まると思います。, 公式チュートリアルにはFigureやAxesにあったような表がないので、同様のものを自分で作って見ました。, Axesの例の最後でax.set_xlabelとax.set_ylabelで軸のラベルを設定しました。これはaxをいじっているように見えますが、実はaxに属するXAxisのlabel属性を変更しています。先ほどのplot2回とscatter1回を描画した例のXAxisで上の表の内容を確認します。, Axesにはその下のAxisやTickを設定するためのax.set_***系のヘルパーメソッドがたくさんあります。ただ、どれも一度設定するとその後の変更に自動的に対応してくれない静的な変更になります。xlabelの場合は特に問題ありませんが、例えば、以下のようにax.set_xticksで一本目のプロットのx範囲に合わせてtickの位置を変えたあとに、その範囲を超えるプロットを追加してもxticksはいい感じに調整されません。, AxisはArtistの他にFormatterとLocatorと呼ばれる軸の見た目の調整には欠かせない地味に重要なものが設定されています。これらはプロットするデータに応じて軸の範囲をスケールする際にtickの位置やtickラベルのフォーマットを自動的に調整する役割を担っています9。ax.set_xticksを使った上の例でXAxisとYAxisのFormatterとLocatorを確認してみます。, FormatterはxとyどちらもデフォルトのScalarFormatterです。一方Locatorはax.set_xticksでticksの場所を指定したxではFixedLocatorに、何もしていないyではデフォルトのAutoLocatorになっています。FormatterやLocatorの種類とそれぞれの効果については以下の公式ドキュメントを見るとなんとなくわかると思います。 https://github.com/matsuken92/Qiita_Contents/blob/master/General/Matplotlib_color_settings.ipynb, Matplotlib colormaps reference cmap=cm.jet_r cmap.set_over('w') #interval上限より外側は白色で塗りつぶす。 CF = plt.counrourf(X, Y, Z, interval, cmap=cmap) 応用として例えば、 cmap.set_over('w', alpha=0) alphaの値をゼロにすると透明になるのでこの範囲は塗りつぶさないようにできる。 AdventarのPython Advent Calendar 2015 21日目の記事です。, Pythonでグラフを描く時、Matplotlibを使うと思います。また最近はSeabornというグラフを綺麗にしてくれるライブラリがあり、自分はそれを愛用しています。ただ、色をもっと自由に選びたい、設定したいという時に+αでColormapのカスタマイズをすると便利です。今回はこれを紹介します。, まずはいつもの一式インポートです。大体Anacondaにあるものですが、足りないものは pip install <入れたいライブラリ名>で入れることができます。, そのまま素直に、irisの種別ごとに色分けして散布図を描くとこんな感じで、白黒になってしまいます・・・。, 引数cに個別に色の名前を指定すると色を指定することが出来ます。でもあんまりスマートじゃない感じがします。, 種別ひとつずつに色を指定するのも大変なので、元々Matplotlibで定義されているカラーマップを使うこともできます。カラーマップについてはここを参考にすると様々なカラーマップの定義を見ることができます。, そこで、自分でこのカラーマップをカスタマイズして定義してみます。 超初心者向けPython入門講座 , # 参考: http://matplotlib.org/examples/color/colormaps_reference.html, # 色をカスタマイズ, その1:色名称で指定 AdventarのPython Advent Calendar 2015 21日目の記事です。. 実践編 とりあえず乱数列を生成し、適当にplotして画像として保存してみます。 import numpy as np import matplotlib.cm as cm import matplotlib.pyplot as plt np.random.seed(0) a = np.random.random((100, 100))* 100 plt.figure() plt.imshow(a, cmap=cm.Paired) plt.savefig("a.png") . matplotlibでは、カラーマップ … 見た目の微調整に苦労してる方、コーヒー1杯で相談に乗ります。, このインタビューではmatplotlibの開発リーダー自身もたまにドキュメントから情報を探すのに苦労してることを告白しています。 ↩, おそらく現在の詳しさの度合いに関係なく大半のmatplotlibユーザーが通ったことのある道ではないでしょうか。 ↩, なぜaxisでなくaxesなのかと思う人も多いでしょう。後述している通り、matplotlibにおいては両者は異なるオブジェクトを意味します。 ↩, ほとんどの場合はどちらでも好きな方を使えばよいと思いますが、GUIでいじれるインタラクティブなグラフを別ウィンドウで出すなどする場合は後者の例の方がよいようです。 ↩, 解剖図を作成するコードもあります。tick関連の設定が参考になります。 https://matplotlib.org/gallery/showcase/anatomy.html ↩, もちろんこの他にもArtistはあります。全体像は artist Module — Matplotlib 2.1.1 documentation を参照してください。四角で囲まれた名前をクリックするとそれぞれのドキュメントに移動できます。 ↩, 2.0.2のマニュアルを見るとhandlerとlabelが必須だったので、あまり便利ではなかったようです。 ↩, 軸の見た目の調整について検索すると必ず遭遇するやつです。この記事で述べているようなことを知らないと、なかなか何をやっているか理解できず最後の一歩の調整に難儀するやつです。私は大嫌いでした。 ↩, これにはちょっとびっくりしました。雰囲気でmatplotlibを使ってる人もけっこう多いのでしょう。 ↩, 物質科学のポスドクです。データ解析やグラフ作りの道具をIgor ProからPythonに変えました。主に測定データの便利な扱い方やグラフ作りに関する話を中心に書きます。前者のネタはピンと来る人は少ないけれど刺さる人には刺さるだろう話が中心になると思います。. https://matplotlib.org/tutorials/colors/colormaps.html, 「plt.contourf()」を「cont」という変数に入れ、「plt.colorbar(cont)」で凡例を描画する, 「contourf」でグラフを書く際に、「extend=”both”」と追記することで、範囲外を一番端の色で埋めることができる. There are also external libraries like and that have many extra colormaps. For help on creating your own colormaps, see Creating Colormaps in Matplotlib. 例えば、上の散布図は値の範囲が0〜20の間に収まっていますが、この点に対して0〜100をマッピングさせると、カラーバーの中の0〜20までの範囲しか使われなくなり、全体的に赤色に寄った散布図となります。 mappable = ax.scatter(x, y, c=z, vmin=0, vmax=100, s=35, cmap=cm) Why not register and get more from Qiita? - FigureオブジェクトにAxesオブジェクトが属している Gallery > Tick locators, 試しに先ほどのax.set_xticksの例でFormatterとLocatorを使ってみます。, ax.set_xticksの例とは違い、描画範囲全体にtickが配置(locate)されています。次はtick labelのフォーマットを変更します。, あまりよい仕上がりではないですが、FormatterとLocatorが担っている役割ははっきりしたと思います。, ちなみに、ax.plotにはマニュアルには明記されていない単位を指定できるオプションxunitsがあります。公式ドキュメントの Gallery > Radian ticks の指示通りにbasic_unitモジュールをimportしてmatplotlib.units.ConversionInterfaceクラスを定義してやると、FormatterやLocatorをわざわざ指定せずに理想に近いradianやdegree単位の軸が書けます。, ようやく一番下の階層に到達しました。Tickは軸上の小さな線(tick)とそこに添えられる文字(tick label)しか持ちません。, Axisのときと同様に、Tickオブジェクトは実際だとXTickとYTickという名前になっています。1stや2nd tickなどはXTickではグラフ下と上、YTickでは左と右のtickのことを指しています。おそらくx軸のtickのラベルをグラフ上部にも表示したい場合などに使うものです。, AxesにもAxisにもTickをいじるためのset_***系のヘルパーメソッドがたくさんあるので、Tickを直接触る必要はほとんどないでしょう。あるいはAxes.tick_paramsでもtickの向きや表示の有無などを一括設定できます。tickの位置やラベルは前述の通りAxisのFormatterとLocatorで設定します。, ここまで把握できれば Tutorials > Customizing matplotlib > A sample matplotlibrc file Copyright©  http://stackoverflow.com/questions/24997926/making-a-custom-colormap-using-matplotlib-in-python 2019.02.18. # 参考: http://matplotlib.org/examples/color/named_colors.html, # 色をカスタマイズ, その2:16進で指定 https://matplotlib.org/3.1.3/tutorials/colors/colormaps.html, 随分雰囲気が変わりますね。カラーマップの解説だけでかなり長くなりますので機会があれば別途詳しく説明したいと思います。, 次にパラメータで指定したvmaxとvminです。カラーマップには色の度合いに対して0〜100の範囲が割り当てられています。先程の参考リンクから引用します。, ここから説明が難しくなるのですが、散布される値の範囲とカラーマップで定義された値の範囲をvmaxとvminでマッピングすることにより色の範囲を表現します。例えば、上の散布図は値の範囲が0〜20の間に収まっていますが、この点に対して0〜100をマッピングさせると、カラーバーの中の0〜20までの範囲しか使われなくなり、全体的に赤色に寄った散布図となります。, 通常vmin、vmaxを省略するとこの範囲が自動的に設定されますので1枚図できれいに見せたいときは指定する必要はないと思います。. Zの後の10はレベルの設定であり、データを等高線により10個に分けるというの意味。 cmapを指定することで、色を使って等高線を表現することができる。 cmap=’PuOr’の場合、Pu(紫)が正の値。Or(オレンジ)が負の値となる。 Help us understand the problem. Matplotlib Lead Dev on Why He Can't Fix the Docs | NumFOCUS, matplotlib 最後の一歩 2020.03.08    What is going on with this article? What is going on with this article? Here we briefly discuss how to choose between the many options. matplotlibで作ったグラフの細かい調整は大変です。何をどういじったらいいのかを調べるのにアホみたいに時間がかかることがあります1。「何を」の部分の名前さえわからないこともあります。解決の糸口を掴んだ後も希望通りの見た目を実現するまでの最後のアレンジに苦労することが多いです2。これらの問題はmatplotlibのグラフがどういう要素で構成されていて、それらに対してどういうことができるかを知ることでいくらか改善されます。私はひたすらStack Overflowの回答を読むことでいろんなつまづきを時間をかけて乗り越えてきましたが、最近になってようやく公式チュートリアルにこの苦労を回避できたはずのヒントが書いてあることに気づきました。初期にざっと目を通したのですが「なるほど、よくわからん」と判断して読み込まなかったArtistに関する簡単な説明です。この記事で、新しいユーザーが私の経験したような無駄な苦労を回避できれば、あるいはすでにある程度なんとなくわかってきたユーザーが理解を深めてもらえたら嬉しいです。, 「こうしたい時はこうする」といった細かいノウハウではなく、いわゆる釣りの仕方(検索の際のキーワード選び)や釣った後のさばき方一般(検索で見つけた近い解法を自分向けにアレンジする際のヒント)に役立つアレコレについて述べます。ウェブに散らばる無数の断片的で対症療法的なメモ、tips、処方箋、レシピの内容がクリアになると思います。matplotlibベースであるSeabornやPandasのプロット機能を使っている人にとっても、グラフの細かな調整をする際に役立つはずです。, 本記事の大部分はmatplotlib公式チュートリアルのArtist tutorialとUsage Guide(執筆時バージョンは2.1.1)を簡単に日本語でまとめたものです。Artistに関して言及した日本語の記事は, などがありましたが、あまりわかりやすいものではなかったのでもう少し噛み砕いて書いてみました。, あなたのかゆいところがどこかにもよりますが、Qiitaにはこういった孫の手がありました。, ただし、この後の内容を読むとこれらの孫の手も伸び縮みさせたり曲げられるようになるはずです。, Jupyter notebookのinlineコマンドを使っていることを前提にしているので、この後の例ではplt.show()は省略されています。, Artistの話の前に、新しいユーザーが絶対に知っておくべきplt.plotとax.plotの違いについて述べます。公式チュートリアルでも A note on the Object-Oriented API vs Pyplot や Coding Styles で言及されていますが、matplotlibでグラフを作るには二つの流儀(インターフェース)があります。公式ドキュメントを含めてネット上に大量にあるmatplotlibのコードにはこの二つが混在していますが、これらの違いについて明記してる例はあまり多くないように思えます。また、意味もなく二つを混ぜて使っている例も多く、これが多くの初心者のつまづきの原因になっていると思います。初めて"matplotlib プロット 方法"で検索した時のことを思い出してください。「plt.なんとかで全部済んでる例があるのになんでax.plotとか変なのがいろいろ出てくる例もあるの?ていうかこのax使ってなくない?バカなの?」と思いませんでしたか?私は思いました。ここではそれぞれの流儀の違いについて述べるだけです。具体的な使い方を知りたい方は以下を参照してください。, fig, ax = plt.subplots()などの後にax.plotなどを使う流儀です。figやaxはこの記事で説明するArtistと呼ばれるオブジェクトの一種です。一番シンプルな例はこんな感じです。, fig = plt.gcf()やax = plt.gca()もありますが、これらは主にPyplotインターフェースからオブジェクト指向インターフェースに切り替える時に使います。前述した「二つの流儀を混ぜて使っている例」はこれらを無自覚に使っているコードのことです。ユーザー自身に二つの流儀を切り替えているという自覚があるなら問題ないのですが、二つの流儀について認識していない初心者が読むと余計な疑問が生まれてしまいます。plt.subplotsやfig.add_subplotを使って最初からオブジェクト指向インターフェースを使うことを勧めます。, plt.なんとかで全部済ませる流儀です。matplotlibの元となったMATLABを模した流儀だそうです。オブジェクト指向方式のように何を操作の対象にするか明示的に指定しなくとも、current figureやcurrent axes3と呼ばれるオブジェクトを自動で設定してくれます4。, Tutorials > Pyplot tutorial で作ってる図を見るとわかる通り、運良くデフォルト設定でもグラフの細かい部分の見栄えに問題ない場合はそこそこのものができます。ただ、オブジェクト指向という概念についてよく理解していない段階でこの流儀に慣れてしまうと、のちほど必ず混乱すると思います。私はしました。また、ある程度の段階までPyplotで図を作っても、いざ細かい調整をしようとすると、結局オブジェクト指向インターフェースのやり方に従うことになります。細かい調整が必要ない非常に簡素なグラフで事足りる時、あるいはちゃちゃっと可視化して何かを確認したい時には使えますが、人に見せる図を作る際は必ず微調整したい部分がでてくるので、早いうちからオブジェクト指向インターフェースに慣れたほうが良いです。, やりたいことがでてくるたびにググっていると、オブジェクト指向についてよく知らなくてもなんとなくmatplotlibにはfig, axなどと表記される階層構造のようなものがあることがわかってくると思います。最新のドキュメントからは削除されてしまったようですが、Matplotlib 1.5.1のFAQ > Usage にあった以下の図が最低限把握しておきたいmatplotlibの階層構造を簡潔に表しています。, 後ほど述べるTickが含まれていない図ですが、階層構造の理解には十分です。この図から以下の二点が読み取れます。

Angular Material Tree Dynamic 4, Ȼスラ Âーム Ps4 53, Ãアーズ Line交換後 ɀ絡 Áし 5, Âヴァンゲリオン Ƶ外の反応 Ů教 33, ĸ学1年 ĸ間テスト予想問題 ǐ科 49, Amazon ǔ像認証 ɛしい 4, Ƅ知県高校入試 2020 ɛ易度 10, Cubase Ű節 Áれる 5, Vba ō刷プレビュー Ãリーズ 12,

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.