如何在遍历数据框时向绘图添加数据

时间:2019-05-19 15:06:19

标签: python pandas loops matplotlib

我有一些临床数据,其中包含多个受试者多次就诊的值。我创建了一个脚本来循环并为包含每次访问值的每个主题创建一个图。现在,我需要向每个主题图添加数据:

  1. 对于每个主题,添加一个新的标记(星号)以仅识别基线值(bcva_OS和bcva_OD)。我只能让它显示所有值的标记。如何仅将基线作为子集?请参阅代码中的注释。如果使用以下命令,则会收到语法错误:

    plt.plot_date(sub_df['visit_date'] if sub_df[sub_df.visit_label == 'Visit 2 - Baseline'],

  2. 对于每个主题,我如何添加一个全新的数据类型,以便将两种数据类型叠加在每个主题的绘图上?我想只用一个主题的数据就可以做到这一点,但是循环又一次...

示例代码:

for subject, sub_df in new_od_df.groupby(by='subject'):

    # Plot fellow eye
    plt.plot(sub_df['visit_date'], sub_df['bcva_OS'], marker='^', 
        label='OS (fellow) ', color=sns.xkcd_rgb['pale red'])

    # Plot treated eye
    plt.plot(sub_df['visit_date'], sub_df['bcva_OD'], marker='o',
        label='OD (treated) ', color=sns.xkcd_rgb['denim blue']) 

    # Trying to plot only the baseline values
    #plt.plot_date(sub_df['visit_date'] if sub_df[sub_df.visit_label == 'Visit 2 - Baseline'], 

    # Plot fellow eye
    plt.plot_date(sub_df['visit_date'], sub_df['bcva_OS'], 
        marker='*', markersize=10,
        label='BL (fellow) ', color=sns.xkcd_rgb['light pink'])

    # Plot treated eye
    plt.plot_date(sub_df['visit_date'], sub_df['bcva_OD'], 
        marker='*', markersize=10,
        label='BL (treated) ', color=sns.xkcd_rgb['baby blue'])

    # Legend the old way
    plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0)

    # Display each chart separately
    plt.show()

样本数据:

       subject treated_eye              visit_label  visit_date  bcva_OD  bcva_OS         refract_OD         refract_OS
index                                                                                                                  
108       1101          OD      Visit 1 - Screening  2016-01-07     27.0     41.0    + 5 + 0.75 X 27    + 5 + 1.75 X 45
115       1101          OD       Visit 2 - Baseline  2016-01-25     35.0     41.0    + 5 + 0.75 X 27  + 5.5 + 1.75 X 40
120       1101          OD  Baseline - VA Session 2  2016-01-25     35.0     41.0    + 5 + 0.75 X 27  + 5.5 + 1.75 X 40
125       1101          OD          Visit 4 - Day 1  2016-02-02     32.0     42.0    + 5 + 0.75 X 27    + 5 + 1.75 X 30
123       1101          OD          Visit 5 - Day 7  2016-02-08     40.0     43.0    + 5 + 0.75 X 28    + 5 + 1.75 X 30
111       1101          OD         Visit 6 - Day 14  2016-02-16     33.0     44.0    + 5 + 0.75 X 27    + 5 + 1.75 X 40
124       1101          OD              Unscheduled  2016-02-24     37.0     44.0  + 4.5 + 1.25 X 30    + 5 + 1.75 X 40
118       1101          OD        Visit 7 - Month 1  2016-02-29     37.0     40.0  + 4.5 + 1.25 X 30    + 5 + 1.75 X 43

示例图:

Sample plot

1 个答案:

答案 0 :(得分:0)

注意:这是对第1点的部分答案。

我不确定我是否完全理解您的请求,尤其是关于第2点:创建新的数据类型。请修改您的问题以使第2点更加清晰。现在,我猜测,您想在减去基线后绘制OD和OS值,这是正确的吗?

关于点1,以下解决方案可以正确获取基线值并将其绘制为虚线。请注意,在使用<?php $args = array( 'numberposts' => 5, 'offset' => 0, 'category' => '', 'orderby' => 'post_date', 'order' => 'DESC', 'include' => '', 'exclude' => '', 'meta_key' => '', 'meta_value' =>'', 'post_type' => 'post', 'post_status' => 'draft, publish, future, pending, private', 'suppress_filters' => true ); $recent_posts = wp_get_recent_posts( $args, ARRAY_A ); foreach($recent_posts as $post): $categories = get_the_category($post['ID']); foreach ($categories as $category): if ($category->cat_name == 'firstcategory'): //first category found var_dump($category->cat_name); endif; if ($category->cat_name == 'secondcategory'): //second category found var_dump($category->cat_name); endif; endforeach; endforeach; ?> 正确创建图形之后,我还添加了图形标题并将对plt.的调用更改为ax.。稍后可能会派上用场,fig,ax=plt.subplots()已要求这样做。

fig.autofmt_xdate()

结果: Plot result