使用来自文件数据的条件来绘制matplotlib python

时间:2017-04-27 07:28:00

标签: python numpy plot np jmathplot

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

Parameter

我如何在08:00,user1,1 08:10,user3,2 08:15,empty,0 .... x-axis上的用户上绘制数小时的二进制数据。根据用户,用户将用不同的标记表示。例如,y-axis表示为user1*表示为user3。用户oy-axis,空10。 用户名后面的数字(在文本文件中)是要决定的 在条件陈述中它将成为哪个标记。

这是我想要做的照片。

enter image description here

1 个答案:

答案 0 :(得分:0)

您可以使用np.recfromcsv加载文件。然后我们将time列转换为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

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()根据您的喜好调整限制。