Как упорядочить ось y графика matplotlib с помощью y-тиков (понедельник → воскресенье), сортирующих данные в процессе? - PullRequest
0 голосов
/ 29 октября 2019

Я пишу программу на python, которая берет данные за последние шесть месяцев и строит их без особого ввода со стороны пользователя, чтобы упростить процесс создания отчетов. Для этого у меня есть x-ticks как 0 → 23 за 24 часа и я хочу установить мои y-ticks так, чтобы они приказывали matplotlib перейти с понедельника (0) → воскресенье (6) и отсортировать точки графика. в процессе, потому что они зафиксированы в своем положении.

Чтобы отсортировать и отформатировать все данные, которые я использовал pandas, numpy и datetime. Для построения графиков я использую matplotlib и numpy. Я работал над этой проблемой некоторое время, и обычно происходит то, что все y-метки располагаются на одном координатном наслоении всех 7 строк в одну.

Это мой текущий код для построения:

fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(1, 1, 1, aspect=1)
ax.scatter(x,y,s=siz, c=colours, 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))

И мои данные построения графика для 'ax.scatter' таковы:

x - число, представляющее час точки графика, 0 → 23

y - строкапредставляющий день точки графика, понедельник → воскресенье

Как указывалось ранее, всякий раз, когда я пытаюсь предварительно установить свои y-тики, я получаю все строки, расположенные друг над другом или с пустым графиком.

Спасибо за помощь:)

1 Ответ

0 голосов
/ 30 октября 2019

Может быть проще сделать это с пандами перед извлечением массивов 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...