Как я могу контролировать согласованность между графиками ошибок в Python? - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть эти данные:

import pandas as pd
URL = "https://stepik.org/media/attachments/lesson/9250/atherosclerosis.csv"
data = pd.read_csv(URL)
atherosclerosis = data.groupby(["age", "dose"]).agg(['mean', 'std'])
atherosclerosis.columns = ['_'.join(col) for col in atherosclerosis.columns]
atherosclerosis

Результат:

          expr_mean  expr_std
age dose                      
1   D1    104.758464  5.863454
    D2    105.545864  4.369024
2   D1    101.004805  5.116310
    D2    102.273629  5.135374

И я строю бары ошибок следующим образом:

plot_data1 = atherosclerosis.xs('D1', level=1, drop_level=False)
plot_data2 = atherosclerosis.xs('D2', level=1, drop_level=False)
plot_index1 = [str(idx) for idx in plot_data1.index]
plot_index2 = [str(idx) for idx in plot_data2.index]
plt.errorbar(plot_index1, plot_data1["expr_mean"], 
             yerr=plot_data1["expr_std"]/2,
             marker="s", mfc='green', 
             markeredgewidth=2, capsize=4, capthick=2, 
             fmt='o-', ecolor="magenta")
plt.errorbar(plot_index2, plot_data2["expr_mean"], 
             yerr=plot_data2["expr_std"]/2,
             marker="s", mfc='green', 
             markeredgewidth=2, capsize=4, capthick=2, 
             fmt='o-', ecolor="magenta")
plt.show()

Результат:

[Result] 1

Можно ли каким-либо образом соединить (1, 'D1') с (1, 'D2') и (2, 'D1') с (2 , 'D2'). Вот так:

[Like there] 2

1 Ответ

1 голос
/ 10 апреля 2020

Вы можете просто изменить данные графика:

plot_data1 = atherosclerosis.xs(1, level=0, drop_level=False)
plot_data2 = atherosclerosis.xs(2, level=0, drop_level=False)

Вывод:

enter image description here


Обновление : чтобы получить то, что вы просите, я бы отсортировал данные и построил график по диапазону:

атеросклероз = атеросклероз.sort_index (level = (1,0)) атеросклероз ['range' ] = np.arange (len (атеросклероз))

plot_data1 = atherosclerosis.xs(1, level=0, drop_level=False)
plot_data2 = atherosclerosis.xs(2, level=0, drop_level=False)
plot_index1 = [str(idx) for idx in plot_data1.index]
plot_index2 = [str(idx) for idx in plot_data2.index]

# atherosclerosis.expr_mean.sort_index(level=['dose','age']).plot(alpha=0)
plt.errorbar(plot_data1['range'], plot_data1["expr_mean"], 
             yerr=plot_data1["expr_std"]/2,
             marker="s", mfc='green', 
             markeredgewidth=2, capsize=4, capthick=2, 
             fmt='o-', ecolor="magenta")
plt.errorbar(plot_data2['range'], plot_data2["expr_mean"], 
             yerr=plot_data2["expr_std"]/2,
             marker="s", mfc='green', 
             markeredgewidth=2, capsize=4, capthick=2, 
             fmt='o-', ecolor="magenta")

plt.xticks(atherosclerosis['range'], atherosclerosis.index);

Выход:

enter image description here

...