YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

Matplotlib デフォルトの色の変更|実は一行でできます!

Matplotlibでグラフを描くと、デフォルトで青→オレンジ→緑→…と色が変わっていきます。

自動で色が変わっていくのは、便利なのですが次のような疑問を持つことも・・。

  • データが10系列以上あると、また青に戻っちゃうんだけどどうすればいいの?
  • この色のサイクルを変更する方法は?

この記事では、Matplotlibのデフォルトの色(カラーサイクル)の変更について紹介していきます。

そもそもデフォルトの色とは?

Matplotlibで複数系列のグラフを描くと、青→オレンジ→緑→…と自動で色が変化していきます。

この色の順番のことを、「カラーサイクル」と呼びます。

カラーサイクルは、次のようにアクセスできます。

import matplotlib.pyplot as plt
plt.rcParams["axes.prop_cycle"]
# cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'])

16進数カラーコードが、cyclerというオブジェクトに格納されていますね。

デフォルトのカラーサイクルの色は、"tab10"というカラーマップをもとに作成されています。

まずはデフォルトのカラーサイクルの色について再確認してみましょう。

デフォルトのカラーサイクル

デフォルトのカラーサイクルは、"tab10"というカラーマップです。

  • カラーマップ:Matplotlibで予め用意された色の組み合わせ

まずはデフォルトのカラーサイクル"tab10"の10色を確認してみましょう。

n = 10
for i in range(n):
    x = (i, i+1)
    y = (i, i)
    plt.plot(x, y, "o-", label=i)

plt.legend()

次のようにデフォルトのカラーサイクルでグラフが描かれます。

系列数が10個を超えると、また青色に戻って色のサイクルが繰り返されます。

n = 20
for i in range(n):
    x = (i, i+1)
    y = (i, i)
    plt.plot(x, y, "o-", label=i)

plt.vlines(n/2, 0, 20, "gray", "--")
plt.legend(ncol=2)

次のように11系列目で、また青に戻ってしまいます。

  • 【参考】plt.pyplot()について、使い方をもっと詳しく知りたい方は次の記事を参考にしてください。
≫Matplotlib plt.plot徹底解説 | 基本操作を総まとめ!
Matplotlibのplt.plotを使用したグラフを作成、グラフの見た目変更、タイトルや軸の設定など基本事項について徹底解説!!この記事を読めば、plt.plotで手軽に手早く簡単に、キレイなグラフ作成可能に!?
www.yutaka-note.com/entry/matplotlib_pyplot
 

また、Jupyter Notebookでは、plt.get_cmap("カラーマップ名")で、カラーマップを確認できます。

  • 【参考】グラフのカラーサイクルではなく、グラフ毎に個別で色を設定したい場合は、次の記事を参考にしてください。
≫Matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
伝わるグラフを作るためのポイントはなんでしょうか?いかに視覚的にわかりやすいか、これが大切です。それには重要な要素に色をつけて、視覚的にうったえることが超大切!この記事では、matplotlibでの色の指定方法について、基本から応用まで徹底解説!
www.yutaka-note.com/entry/matplotlib_color
 

デフォルトの色を使用するには?

デフォルトの各色は、通常の青、オレンジ、緑…とは異なり、やや淡い色合いです。

Matplotlibでは、これらの色を通常の色と区別するために、"tab:色名"としています。

デフォルト色 Matplotlibの色名 16進数カラーコード
tab:blue #1f77b4
オレンジ tab:orange #ff7f0e
tab:green #2ca02c
tab:red #d62728
tab:purple #9467bd
tab:brown #8c564b
ピンク tab:pink #e377c2
グレー tab:gray #7f7f7f
オリーブ tab:olive #bcbd22
シアン tab:cyan #17becf

デフォルトと同じ色を指定したいときは、上表のように"tab:色名"と入力しましょう。

グラフ毎に個別で色を設定したい場合は、次の記事を参考にしてください。

≫Matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
伝わるグラフを作るためのポイントはなんでしょうか?いかに視覚的にわかりやすいか、これが大切です。それには重要な要素に色をつけて、視覚的にうったえることが超大切!この記事では、matplotlibでの色の指定方法について、基本から応用まで徹底解説!
www.yutaka-note.com/entry/matplotlib_color
 

カラーサイクルの変更

plt.rcParams["axes.prop_cycle"]を変更することで、カラーサイクルを変更できます。

カラーサイクルの設定には主に次の3つの方法があります。

  1. 離散型カラーマップを使用
  2. 連続型カラーマップを使用
  3. 自分でカラーサイクルを指定

それぞれの設定方法を確認していきましょう。

離散型カラーマップを使用

Matplotlibで用意されている離散型カラーマップで、カラーサイクルを変更する方法です。

  • plt.rcParams["axes.prop_cycle"] = plt.cycler("color", plt.get_cmap("カラーマップ名").colors)

離散型のカラーマップには、次の種類があります。

qualitative_colormaps = ['Pastel1', 'Pastel2', 'Paired', 
                         'Accent', 'Dark2',
                         'Set1', 'Set2', 'Set3', 
                         'tab10', 'tab20', 'tab20b','tab20c']

for cmap_num, cmap_name in enumerate(qualitative_colormaps):
    cm = plt.get_cmap(cmap_name)
    for i in range(cm.N):
        plt.barh(cmap_num, 1, color=cm(i),linewidth=5, left=i)

plt.xticks([])
plt.yticks(range(len(qualitative_colormaps)), qualitative_colormaps)

横棒グラフを利用して一覧出力しています。

  • 【参考】棒グラフの作成方法については、次の記事を参考にしてください。
≫Matplotlib 棒グラフを徹底解説|複数系列・積み上げ棒グラフ全てOK
Matplotlibで棒グラフを作成する方法がよくわからない…。 棒グラフで悩むなら、MatplotlibあきらめてExcel使おうかな…。 と思ったことはありませんか?そんな方のために、Matplotlibの棒グラフ作成方法を徹底的に解説しました!複数系列?積み上げ棒グラフ?全部大丈夫!
www.yutaka-note.com/entry/matplotlib_bar
 

例として、カラーサイクルに"Set1"のカラーマップを適用してみます。

plt.rcParams["axes.prop_cycle"] = plt.cycler("color", plt.get_cmap("Set1").colors)

n = 9
for i in range(n):
    x = (i, i+1)
    y = (i, i)
    plt.plot(x, y, "o-", label=i)

plt.legend()

次のようにカラーサイクルが変更されています。

同じ要領で他のカラーサイクルを適用することも可能です。

個人的には、特に便利な離散型カラーマップは"tab20"です。

デフォルトの"tab10"ではデータの系列が10個を超えると、色が一巡してしまいます。

"tab20"を指定すれば、データ系列が20個まで対応できます。

plt.rcParams["axes.prop_cycle"] = plt.cycler("color", plt.get_cmap("tab20").colors)

n = 20
for i in range(n):
    x = (i, i+1)
    y = (i, i)
    plt.plot(x, y, "o-", label=i)

plt.legend(ncol=2)

"tab10"と同じような色合いですが、20系列まで色が循環しません。

20系列以上の場合は、連続型のカラーマップを使用する手もあります。

  • 【参考】凡例の設定方法については、次の記事を参考にしてください。
≫Matplotlib plt.legend() | 凡例の位置とスタイル設定完璧ガイド!
Matplotlibでは、デフォルトでは凡例は表示されません。「凡例(legend)を表示するにはどうしたらいいの?!」「凡例の位置や見た目の設定方法がわからない!」という方向けに、「凡例を表示する関数plt.legend()の使い方」「引数で位置や見た目を簡単に設定する方法」を紹介していきます。自分の作りたい凡例を作れるようになりましょう!
www.yutaka-note.com/entry/matplotlib_legend
 

連続型のカラーマップを使用

連続的に色が変化するカラーマップを適用する場合には、次のように設定します。

  • plt.rcParams["axes.prop_cycle"] = plt.cycler("color", plt.get_cmap("カラーマップ名")(np.linspace(0,1,n)))

連続型の場合は、自分でカラーマップをデータ系列数nに分割する必要があるため、np.linspace()を使用しています。

連続型のカラーマップの一部を以下で紹介します。

import numpy as np
sequential_colormaps1 = ['Greys', 'Purples', 'Blues', 'Greens', 'Oranges', 'Reds',
                         'YlOrBr', 'YlOrRd', 'OrRd', 'PuRd', 'RdPu', 'BuPu',
                         'GnBu', 'PuBu', 'YlGnBu', 'PuBuGn', 'BuGn', 'YlGn']

sequential_colormaps2 = ['gray', 'bone','pink', 'spring', 'summer', 'autumn', 'winter',
                         'cool', 'Wistia', 'hot', 'afmhot', 'gist_heat', 'copper']

# サブプロットの準備
fig, axes = plt.subplots(1,2, tight_layout=True)

# 棒グラフの位置調整用, x, dx
xs, dx = np.linspace(0,1,retstep=True)

# 横棒グラフにカラーマップを適用して可視化
for ax, sequential_colormaps in zip(axes, [sequential_colormaps1, sequential_colormaps2]):
    for cmap_num, cmap_name in enumerate(sequential_colormaps):
        cm = plt.get_cmap(cmap_name)
        for x in xs:
            ax.barh(cmap_num, dx, color=cm(x),linewidth=5, left=x)
    # 横軸ラベル削除、縦軸ラベルにカラーマップ名表示
    ax.set_xticks([])
    ax.set_yticks(range(len(sequential_colormaps)), sequential_colormaps)

ここでも棒グラフを応用して、可視化しています。

  • 【参考】plt.subplots()を使用したグラフ作成方法(オブジェクト指向)は、次の記事で詳しく解説しています。
≫Matplotlib plt.subplots()の使い方|FigureとAxesを同時生成!
Matplotlibでグラフを描くとき「fig, ax = plt.subplots()って、よく見るけど何してるの?」「plt.subplots()の便利な使い方を知りたい! 」という方のために、plt.subplots()でFigureとAxesを作ると何が便利なのか、plt.subplots()の基本的な使い方、覚えておくと便利なplt.subplots()の引数をを図解付きで解説します!
www.yutaka-note.com/entry/matplotlib_subplots
 

例として、カラーサイクルに"cool"のカラーマップを適用してみます。

n=9
plt.rcParams["axes.prop_cycle"] = plt.cycler("color", plt.get_cmap("cool")(np.linspace(0,1,n)))

for i in range(n):
    x = (i, i+1)
    y = (i, i)
    plt.plot(x, y, "o-", label=i)

plt.legend()

次のようにカラーサイクルが変更されます。

同じ要領で他のカラーマップを適用することも可能です。

その他のカラーマップは、公式ドキュメントを参照してください。

自分でカラーサイクルを指定

既存のカラーマップを使用せずに、自分で色を直接指定する方法です。

  • plt.rcParams["axes.prop_cycle"] = plt.cycler("color", ["色名など"のリスト])

[赤、青、緑、オレンジ、紫]の順番のカラーサイクルを適用してみましょう。

plt.rcParams["axes.prop_cycle"] = plt.cycler("color", ["red", "blue", "green", "orange", "purple"])
n = 10
for i in range(n):
    x = (i, i+1)
    y = (i, i)
    plt.plot(x, y, "o-", label=i)

plt.legend()

次のようにカラーサイクルが変更されます。

オススメ|matplotlibとデータ分析の勉強方法

今回は、Matplotlibのデフォルトの色変更について基本的なものを解説しました。

Matplotlibは奥の深いモジュールですが、なかなかわかりにくい部分もあります…。

そこで、グラフの作成方法、種類変更、凡例、タイトルの設定など網羅的にわかりやすく整理した記事を作りました。ぜひ参考にしてみてください。

≫【初心者向け】Matplotlibの特徴と使い方をわかりやすく解説!
脱初心者のためのMatplotlibマスターガイドです。そもそもどういう流れでプロットするのか?どんな種類のグラフが描けるのか?日本語設定は?タイトルや軸の設定は?オブジェクト指向って何?そんな疑問を解決します!この記事で、脱Matplotlib初心者を目指そう!
www.yutaka-note.com/entry/matplotlib_guid
 

また、データ分析初心者の方にはこちらの記事もおススメです。

私がこれまで勉強してきた経験をもとに考えたおススメの勉強本の紹介記事です。

何から始めて、どうやってレベルアップしていけばいいのか、初心者の方にぜひおススメしたい本を紹介しました。

≫独学でデータ分析を勉強するオススメ学習本
独学でのpythonデータ分析勉強に役立ったおススメ書籍を紹介していきます。業務でそれなりにデータ分析を行えるまで、いろいろな試行錯誤をしてきましたが、もし自分が今ゼロから勉強する立場ならどうするのがいいのか考えてみました。以下では、入門書、個別モジュール用、実践用の3つの視点でおススメ本を紹介していきます。
www.yutaka-note.com/entry/data_analysis