Может быть проще сделать это с пандами перед извлечением массивов x и y, но вот единственное решение:
Использование только NumPy:
import numpy as np
import matplotlib.pyplot as plt
days = np.array(['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'])
# Generate some dummy x,y data:
N = 100
np.random.seed(42)
x = np.random.randint(0,24,N)
y = np.random.choice(days,N)
y_Idx = np.where(days == np.expand_dims(y,-1))[1]
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(1, 1, 1, aspect=1)
ax.scatter(x,y_Idx, alpha=0.3)
plt.title('Door Logs, Janurary 2019 - Present Day')
plt.xlabel('Hour of Day')
plt.ylabel('Day of Week')
plt.xticks(np.arange(0, 24, step=1))
plt.yticks(np.arange(7),days)
plt.show()
# Sorting the data a posteriori if needed:
sorting_idx = np.argsort(y_Idx)
x_sorted = x[sorting_idx]
y_sorted = y[sorting_idx]
Результирующий график
Шаг за шагом:
Определение массива с отсортированными днями недели:
days = np.array(['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'])
Поискиндекс каждого элемента в вашем массиве y
с np.where
(вы должны выполнить сравнение по новому измерению)
y_Idx = np.where(days == np.expand_dims(y,-1))[1]
Возвращает числовой массив (от 0 до 6) для построения на оси Y.
plt.scatter(x,y_Idx)
Затем подставьте числовые метки в строки:
plt.yticks(np.arange(7),days)
Для сортировкиПо данным с понедельника по воскресенье индексы сортировки можно получить с помощью:
sorting_idx = np.argsort(y_Idx)
x_sorted = x[sorting_idx]
y_sorted = y[sorting_idx]