Numpy matplotlib中带线的条件打印
下面是我的日志文件 data.logNumpy matplotlib中带线的条件打印,numpy,matplotlib,gnuplot,Numpy,Matplotlib,Gnuplot,下面是我的日志文件 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
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和4010的sa和sd
蓝色可用于表示4010的sa和sd
我尝试使用gnuplot执行上述操作,但由于
我试图用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()
再次感谢。首先,我认为您的日志文件甚至不应该使用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])
我举熊猫为例并不是因为它在这里非常有用。相反,熊猫在一般的数据分析中有很多用处。因为您刚刚开始,或者至少听起来像是,这可能是您想要查看的一个包。首先,我认为您的日志文件甚至不应该使用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])
我举熊猫为例并不是因为它在这里非常有用。相反,熊猫在一般的数据分析中有很多用处。由于您刚刚开始,或者至少听起来像是,这可能是您想要查看的一个包。假设您的代码已经绘制了一些内容,现在您只需要根据第二列进行筛选:
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]
?列是从零开始的假设您的代码已经绘制了一些内容,现在只需要根据第二列进行过滤:
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]
?栏目以零为基础感谢您的评论。这就是我最后求助的方法
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"
谢谢你的评论。这就是我最后求助的方法
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"
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
egorical变量,所以我们对它们执行for
循环
for cat in (4010, 4011):
我们已经准备好为列号0
中的每个不同分类变量绘制不同的行;不同的cat
egories通过将列转换为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()
这就是这些努力的结果
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
egorical变量,所以我们对它们执行for
循环
for cat in (4010, 4011):
我们已经准备好为列号0
中的每个不同分类变量绘制不同的行;不同的cat
egories通过将列转换为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()
这就是这些努力的结果
谢谢,我将尝试您的解决方案并返回。谢谢,我将尝试您的解决方案并返回。我做了一些修改(将日志文件加载为字符串),但它给了我一个索引错误。哪一行给出了索引错误?错误是什么?是否是
data.shape
您希望它是什么?>>>plt.plot(data4010[:,3],data4010[:,5],'ro')回溯(最后一次调用):索引器中第1行的文件“”:无效索引。我试图使用data.shape[0]提取行大小并对其进行迭代。但很快我就意识到,在gnuplot中叠加绘图要容易得多。我会发布我的答案。好的,1/3。什么是确切的错误消息,什么是data.shape
?我做了一些修改(将日志文件加载为字符串),但它给了我一个索引错误。哪一行给出了索引错误?错误是什么?是否是data.shape
您希望它是什么?>>>plt.plot(data4010[:,3],data4010[:,5],'ro')回溯(最后一次调用):索引器中第1行的文件“”:无效索引。我试图使用data.shape[0]提取行大小并对其进行迭代。但很快我就意识到,在gnuplot中叠加绘图要容易得多。我会发布我的答案。好的,1/3