Примечание: это частичный ответ на пункт 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()
Результат: