2015-09-28 2 views
2

Я хочу изменить цвет присущи рефлективный, вербальный в соответствии с тем, что они представляют, это сгруппированы парами, поэтому мой вопрос:Изменение цвета в boxplot, когда его парный

Как я могу изменить цвет ящики, когда они спарены? Учитывая, что первый квадрат каждой пары должен быть синим, а второй - красным.

Это код, извините, если это грязно:

def obtenerBoxplotsAnuales(self, directorioEntrada, directorioSalida): 
    meses = ["Enero","Febrero","Marzo","Abril","Mayo","Junio", "Julio", "Agosto","Septie.","Octubre","Noviem.","Diciem."] 
    ciudades = ["CO","CR"]  
    anios = ["2011", "2012", "2013"] 
    boxPlotMensual = [] 
    fig = plt.figure() 
    fig.set_size_inches(14.3, 9) 
    ax = plt.axes() 
    plt.hold(True) 
    for anio in anios: 
     boxPlotAnual = [] 
     i=0 
     ticks = [] 
     for mes in range(len(meses)): 
      data1 = getSomeData() 
      data2 = getSomeData() 
      data = [ [int(float(data1[2])), int(float(data1[0])), int(float(data1[1]))], 
         [int(float(data2[2])), int(float(data2[0])), int(float(data2[1]))] ] 
      plt.boxplot(data, positions=[i,i+1], widths=0.5) 
      ticks.append(i+0.5) 
      i=i+2 
     hB, = plt.plot([1,1],'b-') 
     hR, = plt.plot([1,1],'r-') 
     plt.legend((hB, hR),('Caleta', 'Comodoro')) 
     hB.set_visible(False) 
     hR.set_visible(False) 
     ax.set_xticklabels(meses) 
     ax.set_xticks(ticks) 
     plt.savefig(directorioSalida+"/asdasd"+str(anio)+".ps", orientation='landscape', papertype='A4') 

Это то, что я получаю: Boxplots are all the same colour

Я прочитал, что решение связано с тем, что plt.boxplot(...) возвращает вид объекта dict, который содержит список строк, созданных так, чтобы способ изменения цвета каждого boxplot был бы доступом к индексам? Как в этом случае?

+0

И, кстати, я получаю 23 ящика, потому что, по-видимому, изображение вырезано, кто-нибудь знает, как это решить? – Hernan

ответ

2

Вы можете установить цвет возврата Dict из boxplot следующим образом,

import matplotlib.pyplot as plt 
import numpy as np 

nboxes = 10 

# fake up some data 
spread= np.random.rand(50,nboxes) * 100 
center = np.ones((25,nboxes)) * 50 
flier_high = np.random.rand(10,nboxes) * 100 + 100 
flier_low = np.random.rand(10,nboxes) * -100 
data =np.concatenate((spread, center, flier_high, flier_low), 0) 

# plot figure 
plt.figure() 
bp = plt.boxplot(data) 

for i, box in enumerate(bp['boxes']): 
    #Colour alternate boxes blue and red 
    if i%2: 
     box.set_color('blue') 
    else: 
     box.set_color('red') 

plt.show() 

Где вы перебрать все коробки в bp['boxes'] и использовать метод set_color (вы можете также box.set_markerfacecolor и другие стандартные атрибуты Matplotlib художника) , Код bp также содержит ['boxes', 'fliers', 'medians', 'means', 'whiskers', 'caps'], который также может быть изменен по мере необходимости.