1

我在文件中有数据。它看起来像这样:

08:00,user1,1   
08:10,user3,2   
08:15,empty,0  
....

我怎么能绘制带有小时数x-axis和用户数的二进制数据y-axis。用户将根据用户使用不同的标记来表示。例如,user1被表示为*user3被表示为o。并且y-axis1用户和0空的。用户名后面的数字(在文本文件中)用于在条件语句中决定它将是哪个标记。

这是我想做的照片。

在此处输入图像描述

4

1 回答 1

1

您可以使用 np.recfromcsv 加载文件。然后我们将时间列转换为 datetime 对象,我们为此定义了一个convtime函数。然后我们使用此功能读取您的 CSV 文件。

import numpy as np
import matplotlib.pyplot as plt
convtime = lambda x: datetime.datetime.strptime(x, "%H:%M")
all_records = np.recfromcsv("myfilename.csv", names=["time", "user", "val"], converters={0:convtime}) # This says parse column 0 using the convtime function

请注意,由于我们只给出了时间部分datetime,因此它将假定日期为 1900 年 1 月 1 日。如果您愿意,可以为其添加相关日期。

现在,绘制数据。这给我们带来了一个奇怪的问题,matplotlib 只能使用一个符号来绘制所有点。不幸的是,这意味着我们必须使用 for 循环。首先,让我们dict为每个用户定义符号和颜色的 s:

symbols = {'user1':'*', 'user3':'o', 'empty':'x'}
colours = {'user1':'blue', 'user3':'red', 'empty':'orange'}
for rec in all_records:
    plt.scatter(rec['time'], rec['val'], c=colours[rec['user']], marker=symbols[rec['user']])

几乎可以做到。我们仍然缺少传奇。这个 for 循环的一个缺点是文件中的每一行都会在图例中创建一个条目。我们通过创建自定义图例来解决这个问题。

import matplotlib.lines as mlines
legend_list = []
for user in symbols.keys():
    legend_list.append(mlines.Line2D([], [], color=colours[user], marker=symbols[user], ls='none', label=user))
plt.legend(loc='upper right', handles=legend_list)
plt.show()

这样做!如果你的情节看起来被压扁了,那么用plt.xlim()你的口味来调整限制。

于 2017-04-27T09:32:15.573 回答