pandas / matplotlib棒グラフにカスタムカラーを与える方法


86

Excelの代わりにpandas / matplotlibを使用して、積み上げ棒グラフを生成し始めました。問題が発生しています

(1)デフォルトのカラーマップには5色しかないため、5つ以上のカテゴリがある場合は、色が繰り返されます。より多くの色を指定するにはどうすればよいですか?理想的には、開始色と終了色のグラデーション、およびその間にn色を動的に生成する方法はありますか?

(2)色があまり視覚的に心地よいものではありません。n色のカスタムセットを指定するにはどうすればよいですか?または、グラデーションも機能します。

上記の両方のポイントを示す例を以下に示します。

  4 from matplotlib import pyplot
  5 from pandas import *
  6 import random
  7 
  8 x = [{i:random.randint(1,5)} for i in range(10)]
  9 df = DataFrame(x)
 10 
 11 df.plot(kind='bar', stacked=True)

そして出力はこれです:

ここに画像の説明を入力してください


部分的なカラーマップを取得する非常に簡単な方法があります。以下のこのソリューションを参照してください
Ted Petrou 2017年

回答:


120

あなたは指定することができます colorオプションをリストとしてplot関数に直接。

from matplotlib import pyplot as plt
from itertools import cycle, islice
import pandas, numpy as np  # I find np.random.randint to be better

# Make the data
x = [{i:np.random.randint(1,5)} for i in range(10)]
df = pandas.DataFrame(x)

# Make a list by cycling through the colors you care about
# to match the length of your data.
my_colors = list(islice(cycle(['b', 'r', 'g', 'y', 'k']), None, len(df)))

# Specify this list of colors as the `color` option to `plot`.
df.plot(kind='bar', stacked=True, color=my_colors)

独自のカスタムリストを定義するには、次のいくつかを実行するか、RGB値などでカラーアイテムを定義するためのMatplotlibテクニックを調べます。これを使用すると、必要に応じて複雑にすることができます。

my_colors = ['g', 'b']*5 # <-- this concatenates the list to itself 5 times.
my_colors = [(0.5,0.4,0.5), (0.75, 0.75, 0.25)]*5 # <-- make two custom RGBs and repeat/alternate them over all the bar elements.
my_colors = [(x/10.0, x/20.0, 0.75) for x in range(len(df))] # <-- Quick gradient example along the Red/Green dimensions.

最後の例では、次の単純な色のグラデーションが得られます。

ここに画像の説明を入力してください

凡例に定義された色を強制的に取得させる方法を理解するのに十分な時間、それを試してみませんでしたが、あなたはそれを行うことができると確信しています。

ただし、一般的に、大きなアドバイスは、Matplotlibの関数を直接使用することです。Pandasから呼び出すことは問題ありませんが、Matplotlibから直接呼び出すとより良いオプションとパフォーマンスが得られることがわかります。


3
マイナーバグ:my_colors = [cycle(['b'、 'r'、 'g'、 'y'、 'k'])。next()for i in range(len(df))]は 'b'を返しますPython2.7では毎回。代わりにlist(islice(cycle(['b'、 'r'、 'g'、 'y'、 'k'])、None、len(df)))を使用する必要があります。
vkontori 2012

おかげで、私はおそらくそれを捕まえなかっただろう。もう1つのオプションは、最初にサイクルを作成してからnext、内包表記内でその関数を呼び出すことです。
ely 2012

うん。it = cycle(['b'、 'r'、 'g'、 'y'、 'k']); my_colors =〔はxrangeでiについての次の(IT)(LEN(DF))]、ならびに、それを削減する...
vkontori

1
今日パンダとmatplotlibがインストールされているので、上記のコードは実行されますが、何も生成しません。
kakyo 2015年

@kakyo通常のインタープリター、IPythonで実行していますか、それともシェル(または他の何か)から実行していますか?このコードを実行する環境のタイプによっては、matplotlibのインタラクティブモードをオンにするかpylab.ion()、インタラクティブpylabに設定する必要があります。
ely 2015年

54

最も簡単な方法は、プリセットのカラーグラデーションの1つでcolormapパラメーターを使用すること.plot()です。

df.plot(kind='bar', stacked=True, colormap='Paired')

ここに画像の説明を入力してください

プリセットカラーマップの大規模なリストはここにあります

カラーマップ


19
私の場合、これはすべてのバーで1つの色しか生成しません
tsando 2018

これらのカラーマップリストが便利であることがわかりましたmatplotlib.org/examples/color/colormaps_reference.htmlgallantlab.github.io/colormaps.html
Al Po

15

独自のカラーマップを作成するためのより詳細な回答については、このページにアクセスすることを強くお勧めします

その答えが手間がかかりすぎる場合は、独自の色のリストをすばやく作成して、colorパラメーターに渡すことができます。すべてのカラーマップはcmmatplotlibモジュールにあります。反転したインフェルノカラーマップから30のRGB(およびアルファ)カラー値のリストを取得しましょう。これを行うには、最初にカラーマップを取得してから、0〜1の値のシーケンスを渡します。ここでnp.linspaceは、カラーマップのその部分を表す.4〜.8の30個の等間隔の値を作成します。

from matplotlib import cm
color = cm.inferno_r(np.linspace(.4, .8, 30))
color

array([[ 0.865006,  0.316822,  0.226055,  1.      ],
       [ 0.851384,  0.30226 ,  0.239636,  1.      ],
       [ 0.832299,  0.283913,  0.257383,  1.      ],
       [ 0.817341,  0.270954,  0.27039 ,  1.      ],
       [ 0.796607,  0.254728,  0.287264,  1.      ],
       [ 0.775059,  0.239667,  0.303526,  1.      ],
       [ 0.758422,  0.229097,  0.315266,  1.      ],
       [ 0.735683,  0.215906,  0.330245,  1.      ],
       .....

次に、これを使用して、元の投稿のデータを使用してプロットできます。

import random
x = [{i: random.randint(1, 5)} for i in range(30)]
df = pd.DataFrame(x)
df.plot(kind='bar', stacked=True, color=color, legend=False, figsize=(12, 4))

ここに画像の説明を入力してください


2
以下は別のカラーマップのドキュメントinferno_rです:matplotlib.org/examples/color/colormaps_reference.html
tsando 2018

1
私はこのスニペットに従いましたが、私のカラー配列は常に同じ値を持っています。
faCoffee 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.