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):
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:
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.
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 i
th dans cette liste est la couleur de la barre i
th.
Pour créer cette liste à partir de la palette de couleurs, vous devez appeler la palette de couleurs avec la valeur respective.
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")