使用 python 以指定格式绘制大数据
Plot large data in the specified format using python
我是 Python 的新手,需要一些关于如何以以下格式绘制数据的帮助(请看图片)
我会有这样的文件格式:
# of IDs \t start_time \t end_time
428 1404238888 1404314624
132 1404259731 1404346488
77 1404347808 1404437873
63 1404432707 1404520913
281 1404518967 1404605334
.......
根据评论中的建议,我找到了一种通过按开始和结束时间对 ID 进行聚类来减少数据的方法。我的新文件将采用上述格式,其中第一列说明该时间范围内有多少个 ID(从开始到结束)。
所以我想这种情况下更好的图形表示是做条形图。
我的 y 轴将是 ID 的数量,x 轴将是时间,单位为天(我的总测量时间约为 3 个月)
我想展示的是在什么时间范围内聚集的ID数量最多。
我想要实现的是如下图所示,在我文件的每一行中,我将绘制一个条形图。
我希望上面的图片很好地解释了我想要实现的目标。如果让我知道如何开始图形并以我想要的单位设置 y 轴和 x 轴,那就太好了。抱歉,这是我第一次尝试在 Python 中绘制图表。我为我的项目编写了其他代码,但一直坚持编写代码来绘制我的最终结果。
提前感谢您的帮助
真的很简单。如果您在 matplotlib 的示例部分进行了一些挖掘,您应该不会遇到任何问题。plt.bar(left_edge, height, width)
完全按照您的意愿行事。
得到你需要的。
import matplotlib.pyplot as plt
import csv
如果你的数据真的是一个制表符分隔的文件,它应该是这样的:(你的看起来更像是一个多个空格分隔的文件 tbh)
id start end
428 1404238888 1404314624
132 1404259731 1404346488
77 1404347808 1404437873
63 1404432707 1404520913
281 1404518967 1404605334
读入你的数据。
file = open("test.txt", "r")
reader = csv.DictReader(file, delimiter="\t")
ids = [] #open 3 new lists to hold your data
start = []
end = []
for data in reader:
ids.append(float(data["id"]))
start.append(float(data["start"]))
end.append(float(data["end"])-float(data["start"])) #remember: it's "width" not "right edge coordinate"
这才是真正的剧情。
fig, ax = plt.subplots()
w = sum(end)/len(end)/10 #change the width of the bar
for i in range(len(ids)):
ax.bar(start[i], ids[i], width=end[i])
plt.show()
由于在您的问题中您说条形的右边缘在第二个坐标处结束很重要,因此最好使用 end[i]
进行绘图。但是,正如我在图表中显示的那样,您有一些重叠问题。 IE。第一个结束于 ....314... 而第二个开始于 ....259... 而且不止那个。
你基本上要问的清楚地表明这是错误的:"I want to make each line in my file into a bar, and I have already stacked the y axis height. And x axis are dates."但显然你没有做对,因为直方图中不应该有重叠,如果有重叠表示overlap应该加到bin之前的高度。
我刚才回答了一个类似的问题,关于如何在 matplotlib 中正确处理和堆叠日期, 可能会帮助你。它是在模拟日期时间对象列表上完成的。你的看起来已经用 date2num
转换了,但同样的原则适用(建议你使用 hist
函数并让它处理日期。)
结果(python3,win7,matplotlib 1.3.1):
我是 Python 的新手,需要一些关于如何以以下格式绘制数据的帮助(请看图片)
我会有这样的文件格式:
# of IDs \t start_time \t end_time
428 1404238888 1404314624
132 1404259731 1404346488
77 1404347808 1404437873
63 1404432707 1404520913
281 1404518967 1404605334
.......
根据评论中的建议,我找到了一种通过按开始和结束时间对 ID 进行聚类来减少数据的方法。我的新文件将采用上述格式,其中第一列说明该时间范围内有多少个 ID(从开始到结束)。 所以我想这种情况下更好的图形表示是做条形图。
我的 y 轴将是 ID 的数量,x 轴将是时间,单位为天(我的总测量时间约为 3 个月)
我想展示的是在什么时间范围内聚集的ID数量最多。 我想要实现的是如下图所示,在我文件的每一行中,我将绘制一个条形图。
我希望上面的图片很好地解释了我想要实现的目标。如果让我知道如何开始图形并以我想要的单位设置 y 轴和 x 轴,那就太好了。抱歉,这是我第一次尝试在 Python 中绘制图表。我为我的项目编写了其他代码,但一直坚持编写代码来绘制我的最终结果。
提前感谢您的帮助
真的很简单。如果您在 matplotlib 的示例部分进行了一些挖掘,您应该不会遇到任何问题。plt.bar(left_edge, height, width)
完全按照您的意愿行事。
得到你需要的。
import matplotlib.pyplot as plt import csv
如果你的数据真的是一个制表符分隔的文件,它应该是这样的:(你的看起来更像是一个多个空格分隔的文件 tbh)
id start end 428 1404238888 1404314624 132 1404259731 1404346488 77 1404347808 1404437873 63 1404432707 1404520913 281 1404518967 1404605334
读入你的数据。
file = open("test.txt", "r") reader = csv.DictReader(file, delimiter="\t") ids = [] #open 3 new lists to hold your data start = [] end = [] for data in reader: ids.append(float(data["id"])) start.append(float(data["start"])) end.append(float(data["end"])-float(data["start"])) #remember: it's "width" not "right edge coordinate"
这才是真正的剧情。
fig, ax = plt.subplots() w = sum(end)/len(end)/10 #change the width of the bar for i in range(len(ids)): ax.bar(start[i], ids[i], width=end[i]) plt.show()
由于在您的问题中您说条形的右边缘在第二个坐标处结束很重要,因此最好使用 end[i]
进行绘图。但是,正如我在图表中显示的那样,您有一些重叠问题。 IE。第一个结束于 ....314... 而第二个开始于 ....259... 而且不止那个。
你基本上要问的清楚地表明这是错误的:"I want to make each line in my file into a bar, and I have already stacked the y axis height. And x axis are dates."但显然你没有做对,因为直方图中不应该有重叠,如果有重叠表示overlap应该加到bin之前的高度。
我刚才回答了一个类似的问题,关于如何在 matplotlib 中正确处理和堆叠日期,date2num
转换了,但同样的原则适用(建议你使用 hist
函数并让它处理日期。)
结果(python3,win7,matplotlib 1.3.1):