ValueError в цикле For при создании диаграммы matplotlib из подмножества сгруппированных значений - PullRequest
0 голосов
/ 22 апреля 2019

Мой источник данных изменился, и у меня возникли проблемы с обновлением кода, который создает графики из сгруппированных данных.Я могу успешно построить подмножество данных, но мне нужно добавить условие, которое будет отображать 2 подмножества на одном графике.Есть ли способ, которым я могу структурировать свой for / if / elif, чтобы сделать эту работу?

Это то, что работает

Тем не менее, значения treatment_eye содержат как OD, так и OS иМне нужно отобразить их оба на одном графике: когда OD, мне нужно отобразить значения столбца * _od, а когда OS, мне нужно отобразить значения столбца * _os, чтобы я изменил свой код и получил ошибку значения:

# plot for new data
for subject_group, sub_df in new_df.groupby(by='subject_group'):
    if new_df.treated_eye == 'OD':
        plt.plot(sub_df['visit_number'], sub_df['white_od'], marker='o', label=subject_group)
    elif new_df.treated_eye == 'OS':
        plt.plot(sub_df['visit_number'], sub_df['white_os'], marker='o', label=subject_group)

plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

# add a normal line at -65
# plt.ylim(ymin=-70, ymax=-30) # add ymax to make both color plots consistent
plt.xticks(range(0, new_od_df['visit_number'].max() + 1 , 1))

plt.xlabel('Visit (Months)')
plt.ylabel('Threshold (dB)')

# add a dashed green line and "normal"
plt.axhline(-65, color="green", linestyle='--', dashes=(5, 10)) #length of 5, space of 10
plt.text(13, -65, 'Normal', va='center', ha="left", bbox=dict(facecolor="w",alpha=0.5))


plt.title('RPGR-001: White FST (Treated Eye)')
plt.tight_layout()
# plt.savefig('output/rpgr_fst_white_teye.png')

ValueError Traceback (последний последний вызов) в () 1 # график для новых данных 2 для subject_group, sub_df в new_df.groupby (by = 'subject_group'): ----> 3if new_df.treated_eye == 'OD': 4 plt.plot (sub_df ['visit_number'], sub_df ['white_od'], marker = 'o', label = subject_group) 5 elif new_df.treated_eye == 'OS':

~ \ AppData \ Local \ Continuum \ anaconda3 \ lib \ site-packages \ pandas \ core \ generic.py в ненулевом (self) 1574 повысить ValueError ("Истинное значение{0} является неоднозначным. "1575" Используйте a.empty, a.bool (), a.item (), a.any () или a.all (). "-> 1576 .format (self. )класс . имя )) 15771578 bool = ненулевой

ValueError: Истинное значение Series является неоднозначным.Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().

1 Ответ

0 голосов
/ 22 апреля 2019

Проблема не в matplotlib, а в операторах if. new_df.treated_eye и new_df.treated_eye - это столбцы вашего DataFrame, которые содержат более одной записи. Когда вы делаете if new_df.treated_eye == 'OD', вы воспринимаете new_df.treated_eye как переменную, когда это список. Поскольку вы хотите построить график, когда все элементы удовлетворяют этому условию, вам нужно использовать all()

Поэтому попробуйте следующее

for subject_group, sub_df in new_df.groupby(by='subject_group'):
    if all(new_df.treated_eye == 'OD'):
        plt.plot(sub_df['visit_number'], sub_df['white_od'], marker='o', label=subject_group)
    elif all(new_df.treated_eye == 'OS'):
        plt.plot(sub_df['visit_number'], sub_df['white_os'], marker='o', label=subject_group)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...