web-dev-qa-db-fra.com

Barplot coloré selon une palette de couleurs?

Tout d'abord, je suis assez nouveau dans les couleurs de Matplotlib ou Seaborn. Mon but est de créer un barplot avec des barres colorées selon une palette personnalisée. Quelque chose comme ça, mais avec ma palette personnalisée (voir ci-dessous, une palette avec rouge, orange, vert et bleu):

barplot

J'ai créé ma palette séquentielle personnalisée à l'aide de la méthode LinearSegmentedColormap, mais je ne suis pas en mesure de l'utiliser dans une simple plt.barplot(). Bien sûr, ce n'est pas difficile, mais je ne vois pas le chemin. J'ai créé la palette en utilisant la fonction ci-dessous, obtenue à partir de ce fil: Créer sa propre palette de couleurs en utilisant matplotlib et tracer l'échelle des couleurs

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()

Cela renvoie cette intrigue:

plot palette ok

Pour autant que je puisse comprendre, je ne peux pas utiliser une palette de couleurs (type d'objet de LinearSegmentedColormap()?) Pour les graphiques à barres, mais la palette de couleurs est la façon unique dont j'ai obtenu une palette séquentielle personnalisée.

En résumé, je veux appliquer la palette de couleurs du deuxième tracé (le nuage de points) au premier tracé (le diagramme à barres) . Pour l'instant, je ne peux pas le faire car la fonction barplot() n'a pas d'argument qui accepte un type d'objet LinearSegmentedColormap.

Je le rend probablement plus difficile qu'il ne l'est vraiment, donc j'apprécierais une méthode plus propre ou plus correcte.

8
Dani Carrillo

Pour obtenir un diagramme à barres avec les barres colorées selon une palette de couleurs, vous pouvez utiliser l'argument color de bar(x,y, color=colors), où colors est une liste de longueurs de barres, contenant toutes les les couleurs. C'est à dire. l'entrée ith dans cette liste est la couleur de la barre ith.
Pour créer cette liste à partir de la palette de couleurs, vous devez appeler la palette de couleurs avec la valeur respective.

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 est parfait pour cela, exemple :

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