web-dev-qa-db-ja.com

pandas / matplotlib棒グラフにカスタム色を付ける方法

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)

そして、出力はこれです:

enter image description here

64
vasek1

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.

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

enter image description here

凡例に定義された色を強制的に選択させる方法を理解するのに十分な長さで遊んでいませんでしたが、あなたはそれができると確信しています。

ただし、一般的には、Matplotlibの関数を直接使用することをお勧めします。 Pandas=から呼び出しても問題ありませんが、Matplotlibから直接呼び出した方がより良いオプションとパフォーマンスが得られます。

91
ely

最も簡単な方法は、.plot()colormapパラメーターを事前設定された色のグラデーションのいずれかで使用することです。

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

enter image description here

大きな プリセットカラーマップのリスト を見つけることができます。

colormaps

41
Alexandre

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

その答えが大きすぎる場合は、独自の色のリストをすばやく作成し、colorパラメーターに渡すことができます。すべてのカラーマップはcm matplotlibモジュールにあります。逆インフェルノカラーマップから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))

enter image description here

11
Ted Petrou