带有matplotlib中的行的条件图

时间:2016-05-25 20:00:50

标签: 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    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()

再次感谢。

4 个答案:

答案 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()

这里是这些努力的产物

enter image description here