【问题标题】:conditional plot with lines in matplotlibmatplotlib 中带有线条的条件图
【发布时间】:2016-05-25 20:00:49
【问题描述】:

以下是我的日志文件,

数据日志

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),我需要使用两种颜色。例如,

red 可以用来表示 4010 的 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()

再次感谢。

【问题讨论】:

    标签: numpy matplotlib gnuplot


    【解决方案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))
    

    另一种方法是直接加载到 Pandas 中(也许有点矫枉过正,也许不是你感兴趣的……但这是我的答案,所以我可以把它扔进去!)。这样做的好处是您可以加载混合类型。不过,您的尾随“QI01”字符串仍然存在问题。

    import pandas as pd
    data = pd.read_csv('a.log',header=None,sep='\s+')
    ax.plot(data[3],data[5])
    

    我给出 Pandas 的例子并不是因为它在这里非常有用。相反,Pandas 在一般数据分析中具有很大的实用性。由于您刚刚开始,或者至少听起来像您,这可能是您想要查看的包。

    【讨论】:

    • 谢谢,我会尝试您的解决方案并回来。
    【解决方案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]?列从零开始

    【讨论】:

    • 我做了一些修改(将我的日志文件加载为字符串),但它给了我一个索引错误。
    • 哪一行出现索引错误?错误是什么? data.shape 是你所期望的吗?
    • >>> plt.plot(data4010[:,3], data4010[:,5], 'ro') Traceback(最近一次调用最后):文件“”,第 1 行,在 IndexError: invalid index 中。我试图使用 data.shape[0] 来提取行大小并对其进行迭代。但很快意识到,在 gnuplot 中叠加绘图对我来说要容易得多。我会发布我的答案。
    • 好的,1/3。确切的错误消息是什么,data.shape 是什么?
    【解决方案3】:

    感谢您的所有 cmets。这就是我最终求助的方法。

    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"
    

    【讨论】:

      【解决方案4】:

      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 开始的数组和列表...

      我们准备好绘图了,我们有两个categorical 变量,所以我们对它们执行for 循环

      for cat in (4010, 4011):
      

      我们已经准备好绘制,列号0 中每个不同的分类变量的不同行;获得不同的categories 将列转换为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()
      

      这就是这些努力的产物

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-03
        • 1970-01-01
        相关资源
        最近更新 更多