web-dev-qa-db-ja.com

バープロットはカラーマップに従って色付けされていますか?

まず第一に、私はMatplotlibまたはSeabornの色にかなり慣れていません。私の目的は、カスタムパレットに従って色付けされた棒で棒グラフを作成することです。このようなものですが、私のカスタムパレットを使用しています(以下を参照、赤、オレンジ、緑、青のパレット)。

barplot

LinearSegmentedColormapメソッドを使用してカスタムシーケンシャルパレットを作成しましたが、単純なplt.barplot()では使用できません。確かに難しくはありませんが、道がわかりません。このスレッドから取得した、以下の関数を使用してパレットを作成しました: matplotlibを使用して独自のカラーマップを作成し、カラースケールをプロットします

_def make_colormap(seq):
"""Return a LinearSegmentedColormap
seq: a sequence of floats and RGB-tuples. The floats should be increasing
and in the interval (0,1).
"""
seq = [(None,) * 3, 0.0] + list(seq) + [1.0, (None,) * 3]
cdict = {'red': [], 'green': [], 'blue': []}
for i, item in enumerate(seq):
    if isinstance(item, float):
        r1, g1, b1 = seq[i - 1]
        r2, g2, b2 = seq[i + 1]
        cdict['red'].append([item, r1, r2])
        cdict['green'].append([item, g1, g2])
        cdict['blue'].append([item, b1, b2])

return mcolors.LinearSegmentedColormap('CustomMap', cdict)

#main#
c = mcolors.ColorConverter().to_rgb
rvb = make_colormap(
[c('red'), 0.125, c('red'), c('orange'), 0.25, c('orange'),c('green'),0.5, c('green'),0.7, c('green'), c('blue'), 0.75, c('blue')])

N = 1000
array_dg = np.random.uniform(0, 10, size=(N, 2))
colors = np.random.uniform(0, 5, size=(N,))
plt.scatter(array_dg[:, 0], array_dg[:, 1], c=colors, cmap=rvb)
plt.colorbar()
plt.show()
_

それはこのプロットを返します:

plot palette ok

私が理解できる限り、バープロットにカラーマップ(LinearSegmentedColormap()?のオブジェクトタイプ)を使用することはできませんが、カラーマップはカスタムシーケンシャルパレットを実現するユニークな方法です。

要約すると、私は2番目のプロット(散布図)のカラーマップを最初のプロット(棒グラフ)に適用]したいと思います。現時点では、barplot()関数にはLinearSegmentedColormapオブジェクトタイプを受け入れる引数がないため、これを行うことはできません。

私はおそらくそれを実際よりも難しくしているので、よりクリーンで正確な方法をいただければ幸いです。

8
Dani Carrillo

バーがカラーマップに従って色付けされたバープロットを取得するには、bar(x,y, color=colors)color引数を使用できます。ここで、colorsはすべての長さを含むバーの長さの数のリストです色。つまりそのリストのithエントリは、ithバーの色です。
カラーマップからこのリストを作成するには、それぞれの値でカラーマップを呼び出す必要があります。

enter image description here

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import numpy as np

clist = [(0, "red"), (0.125, "red"), (0.25, "orange"), (0.5, "green"), 
         (0.7, "green"), (0.75, "blue"), (1, "blue")]
rvb = mcolors.LinearSegmentedColormap.from_list("", clist)

N = 60
x = np.arange(N).astype(float)
y = np.random.uniform(0, 5, size=(N,))

plt.bar(x,y, color=rvb(x/N))
plt.show()

Seaborn barplotはこれに最適です

ax = sns.barplot("size", y="total_bill", data=tips, palette="Blues_d")
2
Emanuel