Domanda Impostazione del colore della barra differente in matplotlib Python [duplicato]


Questa domanda ha già una risposta qui:

Supposamente, ho il grafico a barre come di seguito:

BarPlot

Qualche idea su come impostare colori diversi per ogni vettore? Per esempio, AK sarebbe rosso, GA sarebbe verde, ecc.?

Sto usando Pandas e matplotlib in Python

>>> f=plt.figure()
>>> ax=f.add_subplot(1,1,1)
>>> ax.bar([1,2,3,4], [1,2,3,4])
<Container object of 4 artists>
>>> ax.get_children()
[<matplotlib.axis.XAxis object at 0x6529850>, <matplotlib.axis.YAxis object at 0x78460d0>,  <matplotlib.patches.Rectangle object at 0x733cc50>, <matplotlib.patches.Rectangle object at 0x733cdd0>, <matplotlib.patches.Rectangle object at 0x777f290>, <matplotlib.patches.Rectangle object at 0x777f710>, <matplotlib.text.Text object at 0x7836450>, <matplotlib.patches.Rectangle object at 0x7836390>, <matplotlib.spines.Spine object at 0x6529950>, <matplotlib.spines.Spine object at 0x69aef50>, <matplotlib.spines.Spine object at 0x69ae310>, <matplotlib.spines.Spine object at 0x69aea50>]
>>> ax.get_children()[2].set_color('r') #You can also try to locate the first patches.Rectangle object instead of direct calling the index.

Per i suggerimenti di cui sopra, come fare esattamente enumeriamo ax.get_children () e controllare se il tipo di oggetto è il rettangolo? Quindi se l'oggetto è rettangolo, assegneremmo un colore casuale diverso?


44
2017-09-24 05:13


origine


risposte:


Semplice, basta usare .set_color

>>> barlist=plt.bar([1,2,3,4], [1,2,3,4])
>>> barlist[0].set_color('r')
>>> plt.show()

enter image description here

Per la tua nuova domanda, non molto più difficile, devi solo trovare la barra dal tuo asse, un esempio:

>>> f=plt.figure()
>>> ax=f.add_subplot(1,1,1)
>>> ax.bar([1,2,3,4], [1,2,3,4])
<Container object of 4 artists>
>>> ax.get_children()
[<matplotlib.axis.XAxis object at 0x6529850>, 
 <matplotlib.axis.YAxis object at 0x78460d0>,  
 <matplotlib.patches.Rectangle object at 0x733cc50>, 
 <matplotlib.patches.Rectangle object at 0x733cdd0>, 
 <matplotlib.patches.Rectangle object at 0x777f290>, 
 <matplotlib.patches.Rectangle object at 0x777f710>, 
 <matplotlib.text.Text object at 0x7836450>, 
 <matplotlib.patches.Rectangle object at 0x7836390>, 
 <matplotlib.spines.Spine object at 0x6529950>, 
 <matplotlib.spines.Spine object at 0x69aef50>,
 <matplotlib.spines.Spine object at 0x69ae310>, 
 <matplotlib.spines.Spine object at 0x69aea50>]
>>> ax.get_children()[2].set_color('r') 
 #You can also try to locate the first patches.Rectangle object 
 #instead of direct calling the index.

Se hai una trama complessa e vuoi prima identificare le barre, aggiungi quelle:

>>> import matplotlib
>>> childrenLS=ax.get_children()
>>> barlist=filter(lambda x: isinstance(x, matplotlib.patches.Rectangle), childrenLS)
[<matplotlib.patches.Rectangle object at 0x3103650>, 
 <matplotlib.patches.Rectangle object at 0x3103810>, 
 <matplotlib.patches.Rectangle object at 0x3129850>, 
 <matplotlib.patches.Rectangle object at 0x3129cd0>, 
 <matplotlib.patches.Rectangle object at 0x3112ad0>]

71
2017-09-24 05:15



Presumo che tu stia utilizzando Series.plot () per tracciare i tuoi dati. Se guardi i documenti per Series.plot () qui:

http://pandas.pydata.org/pandas-docs/dev/generated/pandas.Series.plot.html

Non c'è colore parametro elencato in cui potresti essere in grado di impostare i colori per il grafico a barre.

Tuttavia, i documenti Series.plot () indicano quanto segue alla fine dell'elenco dei parametri:

kwds : keywords
Options to pass to matplotlib plotting method

Ciò significa che quando si specifica il genere argomento per Series.plot () come bar, Series.plot () chiamerà in realtà matplotlib.pyplot.bar (), e matplotlib.pyplot.bar () riceverà tutti gli argomenti parola chiave extra specificati alla fine dell'elenco di argomenti per Series.plot ().

Se esamini i documenti per il metodo matplotlib.pyplot.bar () qui:

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar

.. accetta anche argomenti di parole chiave alla fine del suo elenco di parametri, e se si utilizza l'elenco di nomi di parametri riconosciuti, uno di questi è colore, che può essere una sequenza che specifica i diversi colori per il grafico a barre.

Mettendo tutto insieme, se si specifica il colore argomento della parola chiave alla fine dell'elenco degli argomenti Series.plot (), l'argomento della parola chiave verrà inoltrato al metodo matplotlib.pyplot.bar (). Ecco la prova:

import pandas as pd
import matplotlib.pyplot as plt

s = pd.Series(
    [5, 4, 4, 1, 12],
    index = ["AK", "AX", "GA", "SQ", "WN"]
)

#Set descriptions:
plt.title("Total Delay Incident Caused by Carrier")
plt.ylabel('Delay Incident')
plt.xlabel('Carrier')

#Set tick colors:
ax = plt.gca()
ax.tick_params(axis='x', colors='blue')
ax.tick_params(axis='y', colors='red')

#Plot the data:
my_colors = 'rgbkymc'  #red, green, blue, black, etc.

pd.Series.plot(
    s, 
    kind='bar', 
    color=my_colors,
)

plt.show()

enter image description here

Notare che se ci sono più barre che colori nella sequenza, i colori si ripeteranno.


27
2017-09-24 07:04



Aggiorna panda 0.17.0

@ La risposta di 7stud per la versione più recente dei panda richiederebbe solo una chiamata

s.plot( 
    kind='bar', 
    color=my_colors,
)

invece di

pd.Series.plot(
    s, 
    kind='bar', 
    color=my_colors,
)

Le funzioni di tracciamento sono diventate membri della serie, oggetti DataFrame e in effetti chiamando pd.Series.plot con un color argomento dà un errore


9
2017-11-10 12:25