Pandas boxplot x 轴设置

tnk*_*epp 5 python boxplot pandas

我想创建一个过去二十年从四个不同站点收集的数据的箱线图(即每个站点将有 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='-')
Run Code Online (Sandbox Code Playgroud)

最初我希望 Pandas 会按列名索引 x 轴,但 Pandas 似乎是根据列位置索引 x 轴,这令人沮丧。任何人都可以推荐一种抵消盒子的方法,这样它们就不会相互重叠吗?

Alv*_*tes 5

您需要指定条形的位置:

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))
Run Code Online (Sandbox Code Playgroud)

或者您可以将盒子移到您喜欢的一侧(这样可以将标签保持居中):

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)
Run Code Online (Sandbox Code Playgroud)