#python #pandas #matplotlib #plot #seaborn
#python #панды #matplotlib #график #seaborn
Вопрос:
Я хотел бы наложить роевую диаграмму на линейную диаграмму с помощью seaborn. Давайте сгенерируем данные моего типа (3 условия, по 3 реплики в каждом, в 3 временных момента) :
condition_list = []
experiment_list = []
day_list = []
result_list = []
for condition in ['A', 'B', 'C']:
for experiment in range(1,4):
for day in range(1,4):
condition_list.append(condition)
experiment_list.append(experiment)
day_list.append(day)
result_list.append(random.random())
datas = list(zip(condition_list,experiment_list,day_list,result_list))
df = pd.DataFrame(data=datas, columns=['Condition','Experiment','Day','Result'])
Я в порядке с диаграммой штриховки :
sns.catplot(x="Condition", y="Result", hue='Day', data=df, kind="bar", ci='sd')
Но если я хочу добавить соответствующие значения в виде точек на этом рисунке, все они будут выровнены по одной и той же оси абсцисс :
sns.catplot(x="Condition", y="Result", hue='Day', data=df, kind="bar", ci='sd')
sns.swarmplot(x="Condition", y="Result", hue='Day', data=df)
Вот моя проблема! Для каждого столбца я хотел бы отобразить в виде точек три соответствующих значения.
Например, если мы ограничим данные за первый день, я могу нанести столбики и точки на один и тот же рисунок :
new_df = df[df['Day'] == 1].reset_index(drop=True)
sns.barplot(x="Condition", y="Result", data=new_df, ci="sd")
sns.swarmplot(x="Condition", y="Result", color='black',data=new_df, zorder=10)
Можно ли сделать то же самое на первом рисунке с помощью seaborn?Большое вам спасибо за вашу помощь ^^
Комментарии:
1. Вы пробовали
sns.swarmplot(..., dodge=True)
? документы и примеры swarmplot
Ответ №1:
Благодаря комментарию Йоханка функция dodge в роевом графике разделяет точки в соответствии с их категорией.
ax = sns.catplot(x="Condition", y="Result", hue='Day', data=df, kind="bar", ci='sd')
ax = sns.swarmplot(x="Condition", y="Result", hue='Day', color='black', dodge=True,data=df)
ax.get_legend().set_visible(False)