Настройка оси x pandas boxplot

Я хочу создать коробчатую диаграмму данных, собранных с четырех разных сайтов за последние двадцать лет (т.е. на каждом сайте будет 20 лет данных). В результате получится 80 коробок на фигуре. Чтобы рисунок был разборчивым, я хочу, чтобы каждое поле было смещено, и чтобы для каждого сайта были разные цветные поля. В результате появится повторяющаяся серия блоков (например, блоки для site1, site2, site3, site3, site1, site2, site3, ...). Создать коробчатую диаграмму - не проблема; смещение ящиков кажется проблемой. например

import numpy as np
import pandas as pd
from pylab import *

first  = pd.DataFrame(np.random.rand(10,5),columns=np.arange(0,5))
second = pd.DataFrame(np.random.rand(10,5),columns=np.arange(5,10))

fig = figure( figsize=(9,6.5) )
ax  = fig.add_subplot(111)

box1 = first.boxplot(ax=ax,notch=False,widths=0.20,sym='',rot=-45)
setp(box1['caps'],color='r',linewidth=2)
setp(box1['boxes'],color='r',linewidth=2)
setp(box1['medians'],color='r',linewidth=2)
setp(box1['whiskers'],color='r',linewidth=2,linestyle='-')

box2 = second.boxplot(ax=ax,notch=False,widths=0.20,sym='',rot=-45)
setp(box2['caps'],color='k',linewidth=2)
setp(box2['boxes'],color='k',linewidth=2)
setp(box2['medians'],color='k',linewidth=2)
setp(box2['whiskers'],color='k',linewidth=2,linestyle='-')

Первоначально я надеялся, что Pandas будет индексировать ось x по имени столбца, но Pandas, похоже, индексирует ось x в соответствии с положением столбца, что разочаровывает. Может ли кто-нибудь порекомендовать способ смещения ящиков, чтобы они не ложились друг на друга?


person tnknepp    schedule 13.01.2014    source источник


Ответы (1)


Вам необходимо указать положение полос:

box1 = first.boxplot(ax=ax,notch=False,widths=0.20,sym='',rot=-45, positions=np.arange(0.0,4.0,1.0))
box2 = second.boxplot(ax=ax,notch=False,widths=0.20,sym='',rot=-45, positions=np.arange(0.3,4.3,1.0))

Или вы можете переместить поля в сторону, которая вам нравится (при этом этикетка будет оставаться по центру):

disp = 0.15
for k in box1.keys():
    for line1,line2 in zip(box1[k],box2[k]):
        setp(line1,xdata=getp(line1,'xdata') - disp)
        setp(line2,xdata=getp(line2,'xdata') + disp)
person Alvaro Fuentes    schedule 13.01.2014
comment
Спасибо xndrme, но цель состоит в том, чтобы все было в одном сюжете (то есть в одном подзаголовке). - person tnknepp; 14.01.2014
comment
@tnknepp Добро пожаловать. Я добавил способ перемещения ящиков, сохраняя метку столбца по центру, если это вас интересует. - person Alvaro Fuentes; 14.01.2014
comment
Это здорово, избавляет меня от необходимости разобраться в этом сам. Еще раз спасибо. - person tnknepp; 14.01.2014