Numpy matplotlib中带线的条件打印

Numpy 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

下面是我的日志文件

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和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