seaborn перекрывает диаграмму роя на линейчатой диаграмме

#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)
  

введите описание изображения здесь