99

積み上げ棒グラフを生成するために、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)

そして出力はこれです:

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

4

3 に答える 3

133

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から直接呼び出すとより良いオプションとパフォーマンスが得られることがわかります。

于 2012-08-13T03:39:34.913 に答える
55

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

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

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

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

カラーマップ

于 2016-08-01T22:50:51.950 に答える
17

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

その答えがあまりにも手間がかかる場合は、すぐに独自の色のリストを作成して、それらを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))

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

于 2017-11-06T22:30:06.127 に答える