Realce pontos matplotlib que ultrapassam ou abaixo de um limite nas colors com base na quantidade que os limites são ultrapassados

Eu tenho um gráfico que se parece com isso:

E o código que estou executando para obter este gráfico (um de uma seqüência de 8 charts) está abaixo:

date_list = list(df_testing_set['date'].unique()) random_date_list = list(np.random.choice(date_list,8)) df_new = df_testing_set[df_testing_set['date'].isin(random_date_list)] for date1 in random_date_list: df_new = df_testing_set[df_testing_set['date'] == date1] title = date1 if df_new.iloc[0]['day'] in ['Saturday', 'Sunday']: df_shader = df_result_weekend.copy() title += " - Weekend" else: df_shader = df_result_weekday.copy() title += " - Weekday" y = df_new[row_index].tolist() x = range(0, len(y)) x_axis = buckets y_axis = df_shader.loc[df_shader.index.isin([row_index]) & df_shader['Bucket'].between(1, 144), data_field].tolist() del y_axis[-1] plt.title(title) plt.xlabel("Time of Day (10m Intervals)") plt.ylabel(data_field + " values for " + row_index) standevs = df_shader.loc[df_shader.index.isin([row_index]) & df_shader['Bucket'].between(1, 144), 'StanDev'].tolist() del standevs[-1] lower_bound = np.array(y_axis) - np.array(standevs) upper_bound = np.array(y_axis) + np.array(standevs) plt.fill_between(x_axis, lower_bound, upper_bound, facecolor='lightblue') #highlighting anomalies # if (y > upper_bound | y < lower_bound): # plt.plot(x,y, 'rx') # else: # plt.plot(x, y) plt.plot(x,y) plt.show() del df_shader, title, date1, df_new 

Estou tentando criar uma condição (como a declaração if comentada) de tal forma que quando as coordenadas plotadas upper_bound acima do limite upper_bound ou abaixo de lower_bound , os pontos serão marcados com um ‘x’ em colors diferentes. Eu quero no final tê-lo de tal forma que se um ponto exceder o limite em 1 desvio padrão, ele será marcado em laranja, e se exceder 2 ou mais desvios padrão, ele será marcado em vermelho. Eu tenho todos os desvios padrão no quadro de dados df_shader sob a coluna StanDev . Sempre que eu tento executar alguma variação do if-block, eu recebo erros de variables ​​e erros de nome

Você pode usar máscaras booleanas para selecionar pontos que preencham certas condições e plotá-las:

 import matplotlib.pyplot as plt import numpy as np std = 0.1 N = 100 x = np.linspace(0, 1, N) expected_y = np.sin(2 * np.pi * x) y = expected_y + np.random.normal(0, std, N) dist = np.abs(y - expected_y) / std mask1 = (1 < dist) & (dist <= 2) mask2 = dist > 2 plt.fill_between(x, expected_y - 0.1, expected_y + 0.1, alpha=0.1) plt.fill_between(x, expected_y - 0.2, expected_y + 0.2, alpha=0.1) plt.plot(x, y) plt.plot(x[mask1], y[mask1], 'x') plt.plot(x[mask2], y[mask2], 'x') plt.tight_layout() plt.savefig('mp_points.png', dpi=300) 

Resultado:

resultado

Use a indexação booleana para identificar esses pontos e plotá-los separadamente:

 import numpy as np x = np.random.rand(20) b = x > 0.7 print(b) print(x[b])