以下是我的日志文件
data.log
sa 4011 1259 3840 15 4864 19 156
sa 4011 1267 3840 15 5120 20 157
sa 4011 1275 3840 15 5376 21 158
sa 4010 1282 3072 3 1024 1 56
sd 4010 1283 2048 2 1024 1 41 QIO1
sa 4011 1283 3840 15 5632 22 159
sd 4011 1291 3584 14 5632 22 114 QIO1
sa 4011 1291 3840 15 5632 22 161
sa 4011 1299 3840 15 5888 23 162
sa 4011 1307 3840 15 6144 24 163
sa 4010 1314 3072 3 1024 1 60
sa 4011 1315 3840 15 6400 25 164
sd 4010 1323 2048 2 1024 1 46 QIO1
sa 4011 1323 3840 15 6656 26 166
我想根据第二列做一个条件图。 我的x轴应该是第3列, y轴应为第5列。 由于我在第2列(4010和4011)中有两个不同的元素,我需要使用两种颜色。例如,
红色可用于表示4010和s的sa和sd 蓝色可以用来表示4010的sa和sd
我尝试使用gnuplot执行上述操作但由于无法成功 Gnuplot: conditional plotting ($2 == 15 ? $2 : '1/0') with lines
我正在尝试使用matpyplot,但我是新手。有人可以指导我如何进行。这是我有多远。
import numpy as np
import pylab as pl
data = np.loadtxt('data.log')
# plot the 3rd column as x, and 5th column as y
pl.plot(data[:,3], data[:,5], 'ro')
pl.xlabel('x')
pl.ylabel('y')
pl.show()
再次感谢。
答案 0 :(得分:1)
首先,我不认为您的日志文件甚至应该使用np.loadtxt加载,因为您有混合类型和不一致的列数。如果您删除所有" QI01"如果您将类型指定为str:
,则可以通过loadtxt加载字符串data = np.loadtxt('data.log',dtype=str)
这仍然需要转换为int(或float,无论如何)来进行绘图。
fig = pl.figure(figsize=(4,4))
ax = fig.add_subplot(111)
ax.plot(data[:,3].astype(int),data[:,5].astype(int))
另一种选择是直接加载到熊猫(也许是矫枉过正,也许不是你感兴趣的......但这是我的答案,所以我把它扔进去!)。这样做的好处是可以加载混合类型。您的尾随问题仍然存在问题" QI01"尽管如此。
import pandas as pd
data = pd.read_csv('a.log',header=None,sep='\s+')
ax.plot(data[3],data[5])
我给Pandas的例子不是因为它在这里是有用的。相反,Pandas在数据分析方面具有如此多的实用性。由于你刚刚开始,或者至少它听起来像你,这可能是你想要看的包。
答案 1 :(得分:1)
假设您的代码已经绘制了某些内容,您现在只想基于第二列进行过滤:
import numpy as np
import pylab as plt
data = np.loadtxt('data.log')
data4011 = data[data[:,1] == 4011]
data4010 = data[data[:,1] == 4010]
plt.plot(data4010[:,3], data4010[:,5], 'ro')
plt.plot(data4011[:,3], data4011[:,5], 'bo')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
您确定要[:,3]
而不是[:,2]
吗?列是从零开始的
答案 2 :(得分:0)
感谢您的所有评论。这是我最终使用的。
cat data.log | grep "^[sa|sd]" | while read l; do i=`echo $l |awk '{print $2}'`; echo $l >> ${i}.log; done
我收到了两个文件4010.log和4011.log
set terminal png
set output 'overlay_image.png'
set xtic auto # set xtics automatically
set ytic auto
set yrange [0:63]
set autoscale
set grid
set title "queue size vs time (in ns)"
set xlabel "time (in ns)"
set ylabel "queue size"
set style data linespoints
plot "4010.log" using 3:5 title "IQ 0", \
"4011.log" using 3:5 title "IQ 1"
答案 3 :(得分:0)
matplotlib解决方案
我们必须要求一些外部模块
import numpy as np
import matplotlib.pyplot as plt
以下内容使我们能够将您的数据融入数字数组
with open('category.dat') as f:
data = np.array([[int(s) for s in line.strip().split()[1:8]] for line in f])
请注意,我已经放弃了第一列和可选的最后一列,并且Python从0
开始索引数组和列表......
我们已准备好绘制,我们有两个 cat
非正变量,所以我们对它们进行for
循环
for cat in (4010, 4011):
击> <击> 撞击>
我们准备为列号0
中的每个不同分类变量绘制不同的行;获得了不同的cat
个因素,将列转换为set
for cat in set(data[:,0]):
# indices is an array of booleans that indicates the rows where
# row[0] is equal to the current value of cat
indices = data[:,0] == cat
# now we plot the second column (1 counting from zero) vs the 4th (i.e., 3)
# I add a label to each curve
plt.plot(data[:,1][indices], data[:,3][indices], "o-", label=str(cat))
最后,在for循环中,我用标签绘制图例,我确保y轴从零开始,并要求matplotlib显示图。
plt.legend(loc='best')
plt.ylim(ymin=0)
plt.show()
这里是这些努力的产物