2016-03-09 36 views
8

Similar to a question I asked previously, ho un MWE come questo:Cambiare il colore della matplotlib bar istogramma bin selezionato, dato il suo valore

import pandas as pd 
import matplotlib.pyplot as plt 
import seaborn as sns 
import numpy as np 

pd.Series(np.random.normal(0, 100, 1000)).plot(kind='hist', bins=50, color='orange') 

bar_value_to_colour = 102 

Allora voglio utilizzare la variabile bar_value_to_colour per cambiare automaticamente il colore della barra sull'istogramma in cui il valore risiede al blu, per esempio:

enter image description here

Come posso raggiungere questo obiettivo?

+0

Non capisco pienamente che cosa stai cercando di ottenere. Vuoi cambiare i colori delle barre con il valore 100 in blu? Puoi provare a spiegare l'ultima frase della tua domanda? –

+0

Ho modificato la domanda, questo rende le cose più chiare? – BML91

+1

cristallino ora. –

risposta

7

È facile ottenere la coordinata x della barra con rectangle.get_x() ma il problema è che le barre non sono tracciate esattamente ai valori specifici, quindi ho dovuto scegliere quella più vicina. Qui è la mia soluzione:

import pandas as pd 
import matplotlib.pyplot as plt 
import numpy as np 

s = pd.Series(np.random.normal(0, 100, 10000)) 
p = s.plot(kind='hist', bins=50, color='orange') 

bar_value_to_label = 100 
min_distance = float("inf") # initialize min_distance with infinity 
index_of_bar_to_label = 0 
for i, rectangle in enumerate(p.patches): # iterate over every bar 
    tmp = abs( # tmp = distance from middle of the bar to bar_value_to_label 
     (rectangle.get_x() + 
      (rectangle.get_width() * (1/2))) - bar_value_to_label) 
    if tmp < min_distance: # we are searching for the bar with x cordinate 
          # closest to bar_value_to_label 
     min_distance = tmp 
     index_of_bar_to_label = i 
p.patches[index_of_bar_to_label].set_color('b') 

plt.show() 

rendimenti:

enter image description here

+0

@ BML91 Ho apportato una piccola correzione nel mio codice, quindi calcola la distanza dal centro della barra invece di calcolarla dalla coordinata sinistra della barra. 'tmp = abs ((rectangle.get_x() + (rectangle.tw_get_width() * (1/2))) - bar_value_to_label)' invece di 'tmp = abs (rectangle.get_x() - bar_value_to_label)'. Può essere importante se le barre sono più spesse .. –