Как добавить данные в графики во время циклического прохождения данных - PullRequest
0 голосов
/ 19 мая 2019

У меня есть некоторые клинические данные, которые содержат значения для нескольких посещений для нескольких субъектов. Я создал скрипт для цикла и создал график для каждого предмета, содержащий значения для каждого посещения. Теперь мне нужно добавить данные к каждому сюжету:

  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 голосов
/ 22 мая 2019

Примечание: это частичный ответ на пункт 1:

Я не уверен, что полностью понял ваши запросы, особенно в отношении пункта 2: создание нового типа данных. Пожалуйста, измените ваш вопрос, чтобы прояснить пункт 2. Прямо сейчас я догадываюсь вы хотите отобразить значения OD и OS после вычитания базовой линии, это правильно?

Что касается пункта 1, приведенное ниже решение правильно получает базовые значения и отображает их в виде пунктирной линии. Обратите внимание, что я также добавил заголовок сюжета и изменил вызовы с plt. на ax. после правильного создания фигуры с использованием fig,ax=plt.subplots(). Это может пригодиться позже и уже требуется для fig.autofmt_xdate().

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.style.use('ggplot')
import seaborn as sns

data="""index,subject,treated_eye,visit_label,visit_date,bcva_OD,bcva_OS,refract_OD,refract_OS
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
"""

## DataFrame cleanup
df=pd.read_csv(pd.compat.StringIO(data),sep=",",index_col=0)
df_obj = df.select_dtypes(['object'])
df[df_obj.columns] = df_obj.apply(lambda x: x.str.strip())

df['visit_date']=pd.to_datetime(df['visit_date'])

for subject, sub_df in df.groupby(by='subject'):
    mask=(sub_df.visit_label == 'Visit 2 - Baseline')
    bcva_OS_baseline=sub_df['bcva_OS'][mask].values
    bcva_OD_baseline=sub_df['bcva_OD'][mask].values

    fig,ax=plt.subplots()    

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

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

    # Plot fellow eye
    ax.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
    ax.plot_date(sub_df['visit_date'], sub_df['bcva_OD'], 
        marker='*', markersize=10,
        label='BL (treated) ', color=sns.xkcd_rgb['baby blue'])

    # Plot baseline
    ax.axhline(bcva_OS_baseline,color=sns.xkcd_rgb['pale red'],linestyle="dashed")
    ax.axhline(bcva_OD_baseline,color=sns.xkcd_rgb['denim blue'],linestyle="dashed")

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

    # Display each chart separately
    ax.set_title('subject {0}'.format(subject))
    fig.autofmt_xdate()
    plt.tight_layout()
    plt.show()

Результат: Plot result

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...