Создание группы и отображение суммы в pyplot

#python #pandas #numpy #matplotlib #seaborn

#python #панды #numpy #matplotlib #seaborn

Вопрос:

Пример кода

 import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
import numpy as np

dayOfMonth = np.random.randint(low =1, high =32, size=(50))
dayOfWeek = np.random.randint(low =1, high =6, size=(50))
dayOfWork = np.random.randint(low =1, high =22, size=(50))
minute = np.random.randint(low =1, high =61, size=(50))

data = {'DayOfWeek' : dayOfWeek,
        'DayOfWork' : dayOfWork,
        'Minute' : minute}

df = pd.DataFrame (data)

sns.set_style("whitegrid");

sns.FacetGrid(df, hue="DayOfWeek", height=10) 
   .map(plt.scatter, "DayOfWork","Minute") 
   .add_legend();
plt.xticks(range(0,22,1))
plt.yticks(range(0,61,10))

plt.show();
  

Текущий график.
введите описание изображения здесь

Ожидаемый график. введите описание изображения здесь

Возможно ли это ожидание? Я новичок в этой области, поэтому прошу прощения.

Ответ №1:

 import pandas as pd
import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
import numpy as np

def get_start_end_point(df, x_range, cluster_size):
    start_x = 0
    start_y = 0
    end_x = -1
    end_y = -1
    x_points = []
    y_points = []
    x_group = []
    y_group = []
    groups_sum = []
    group_sum = 0
    for i in x_range:
        temp = df[df['DayOfWork'] == i]
        if i%cluster_size == 1:
            x_group.append(i)
            y_group.append(0)
        if len(temp) != 0:
            group_sum  =temp['Minute'].sum()
            x_group.append(i)
            y_group.append(temp['Minute'].iloc[-1])
        if (i%cluster_size == 0 or i == x_range.stop) and i !=0:
            x_group.append(i)
            y_group.append(0)
            x_points.append(x_group.copy())
            y_points.append(y_group.copy())
            groups_sum.append(group_sum)
            x_group.clear()
            y_group.clear()
            group_sum = 0
            
    return x_points, y_points, groups_sum

dayOfWeek = np.random.randint(low =1, high =6, size=(50))
dayOfWork = np.random.randint(low =1, high =22, size=(50))
minute = np.random.randint(low =1, high =61, size=(50))

data = {'DayOfWeek' : dayOfWeek,
        'DayOfWork' : dayOfWork,
        'Minute' : minute}

df = pd.DataFrame(data)

x_points,y_points, groups_sum = get_start_end_point(df.sort_values(["DayOfWork", "Minute"]).reset_index(drop=True),range(0,22),3)

sns.set_style("whitegrid");

fig, ax = plt.subplots(figsize=(10, 10))
ax.set_xticks(range(0,22,1))
ax.set_yticks(range(0,61,10))

for i in range(0, len(x_points)):
    ax.plot(x_points[i], y_points[i],'b--',lw = 1)
    ax.fill_between(x_points[i], y_points[i], color='#c9eaff') 

sns_plot = sns.FacetGrid(df, hue="DayOfWeek", height=10)
sns_plot.map(ax.scatter, "DayOfWork","Minute")
sns_plot.add_legend()
  

После этого я могу создавать группы и изменять цвет фона.

Но когда я пытаюсь показать график, он отображается в двух подзаголовках. Его метка, ось X и имя оси Y показаны на втором графике.

Также у меня есть сумма группы, как я могу отобразить поверх группы?

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