如何使用y标记(星期一→星期日)对matplotlib图的y轴进行排序(星期一→星期日),以对过程中的数据进行排序?

时间:2019-10-29 10:40:40

标签: python pandas numpy matplotlib plot

我正在编写一个python程序,该程序从过去六个月中获取数据并在没有用户大量输入的情况下对它们进行绘图,以简化我的报告流程。为此,我在24小时内将我的x勾号设置为0→23,并希望设置我的y勾号,以便由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 :(得分:0)

在提取x和y数组之前,用熊猫做这件事可能会更容易,但这是一个仅用于numpy的解决方案:

仅使用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]

Resulting plot

逐步:

定义一个按星期几排序的数组:

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]