Маркировка Seaborn Barplot с непоследовательным оттенком - PullRequest
0 голосов
/ 02 ноября 2018

Доброе утро,

Я изо всех сил пытался маркировать категорические «оттенки» для барборда морского побережья. У меня есть код работает, если есть точки данных для каждой позиции на оси X, но я получаю сообщение об ошибке (height = rect.get_height ()), поскольку первая прямоугольная позиция показывает значение NaN. Я не уверен, как «сместить» к следующему прямоугольнику, где есть значение.

Вот пример df:

    Procedure    plan_cat Region      Fees  Referrals
0           9   InNetwork      a  0.178155         44
1          92   InNetwork      a  1.491056          1
2           9   InNetwork      b  0.249290         45
3          92   InNetwork      b  1.491000          2
4           9   InNetwork      c  0.250906        105
5          92   InNetwork      c  1.490889          2
6           9   InNetwork      d  0.316211         63
7          92   InNetwork      d  1.491000          3
8           9   InNetwork      e  0.300000         29
9          92   InNetwork      e  1.491000          4
10          9   InNetwork      f  0.300000         24
11         92   InNetwork      f  1.491000          5
12          9  Specialist      a  0.433522          6
13         89  Specialist      a  1.481618          6
14          9  Specialist      b  0.594962          2
15         89  Specialist      b  1.487511          9
16          9  Specialist      c  0.879057          6
17         89  Specialist      c  1.484376         25
18          9  Specialist      d  1.153279          8
19         89  Specialist      d  1.467492         22
20          9  Specialist      e  1.009909          6
21         89  Specialist      e  1.495741         11
22         92  Specialist      e  1.736217          2
23          9  Specialist      f  1.568886         10
24         89  Specialist      f  1.683757         22

Я только что выучил трюк pd.read_clipboard, выделил полный df с помощью курсора и ctrl + c и следую дальше.

df = pd.read_clipboard()

df['plan_cat']=df['plan_cat'].astype('category')

for prod in set(df['Procedure']):
    deef = df[df['Procedure']==prod]  
    deef.reset_index(inplace=True,drop=True)
    a4_dims = (11.7, 8.27)
    fig, ax = plt.subplots(figsize=a4_dims)
    gr=sns.barplot( x='Region' , y='Referrals', data=deef,ci=0  , hue='plan_cat'
                   ,ax=ax ,saturation=.6, alpha=.5,hue_order=['InNetwork','Specialist'])                    
    gr.axes.set_title("Procedure "+str(prod),fontsize=25)
    gr.set_xlabel("Region Code",fontsize=15)
    gr.set_ylabel("Referrals",fontsize=15)
    gr.tick_params(labelsize=10)
    rects = gr.patches
    for rect, label in zip(rects,deef['Fees']):
        height = rect.get_height()
        if np.isnan(height):
            continue
        gr.text(rect.get_x() + rect.get_width()/2, height+0.2,str(round(label,2)), 
                color='black',
                ha="center",fontweight='bold')

График процедуры 9 выглядит точно так же, как и планировалось.

good

Однако, если «InNetwork» отсутствует, как в процедуре 89, или «Специалист» не следует в идеальной последовательности, начиная с «a», маркировка выходит из строя или опускается.

bad bad 2

Я дурачился с печатными циклами rect.height, rect.get_x в циклах, чтобы увидеть, как они позиционируются, и не имеет смысла, почему 1 «Специалист» в процедуре 92 визуально отображается в области «e» но прямоугольник в 0?

В любом случае, спасибо за помощь.

Мой комментарий в представлении кода:

for rect, label in zip(rects,deef['Fees']):
    print(str(round(rect.get_x(),1))+':'+str(rect.get_height()))

-0.4:1.0
0.6:2.0
1.6:2.0
2.6:3.0
3.6:4.0
4.6:5.0
0.0:nan
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...