使用文件数据中的条件使用 matplotlib 绘图 python
Using a condition from file data to plot with matplotlib python
我在文件中有数据。它看起来像这样:
08:00,user1,1
08:10,user3,2
08:15,empty,0
....
我如何绘制 x-axis
上的小时数和 y-axis
上的用户的二进制数据。用户将根据用户使用不同的标记表示。例如,user1
表示为 *
,user3
表示为 o
。 y-axis
对于用户是 1
,对于空是 0
。
用户名后的数字(在文本文件中)用于决定
在条件语句中它将是哪个标记。
这是我想要做的事情的照片。
您可以使用 np.recfromcsv 加载文件。然后我们将时间列转换为日期时间对象,为此我们定义了一个 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()
调整您的口味限制。
我在文件中有数据。它看起来像这样:
08:00,user1,1
08:10,user3,2
08:15,empty,0
....
我如何绘制 x-axis
上的小时数和 y-axis
上的用户的二进制数据。用户将根据用户使用不同的标记表示。例如,user1
表示为 *
,user3
表示为 o
。 y-axis
对于用户是 1
,对于空是 0
。
用户名后的数字(在文本文件中)用于决定
在条件语句中它将是哪个标记。
这是我想要做的事情的照片。
您可以使用 np.recfromcsv 加载文件。然后我们将时间列转换为日期时间对象,为此我们定义了一个 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()
调整您的口味限制。