通过从文件中读取步骤图

时间:2013-09-18 06:34:44

标签: python matplotlib plot

我是matplotlib的新手。我试图绘制步骤功能并遇到一些麻烦。现在我能够从文件中读取并绘制它,如下所示。但顶部的图形不是分步骤,下面的图形不是一个合适的步骤。我看到了通过给出x& amp来绘制步骤函数的例子。 y值。我不知道如何通过读取文件来做到这一点。有人能帮助我吗?

from pylab import plotfile, show, gca
import matplotlib.pyplot as plt
import matplotlib.cbook as cbook

fname = cbook.get_sample_data('sample.csv', asfileobj=False)

plotfile(fname, cols=(0,1), delimiter=' ')
plotfile(fname, cols=(0,2), newfig=False, delimiter=' ')
plt.show()

样本输入(3列):

27023927    3   0
27023938    2   0
27023949    3   0
27023961    2   0
27023972    3   0
27023984    2   0
27023995    3   0
27024007    2   0
27024008    2   1
27024018    3   1
27024030    2   1
27024031    2   0
27024041    3   0
27024053    2   0
27024054    2   1
27024098    2   0

注意:我已将y轴1的值设为3&因此,该图可以出现在顶部,而另一个y轴2可以出现在0和0之间。 1,使其位于底部,如下所示


现在看起来波形 enter image description here

3 个答案:

答案 0 :(得分:1)

基本上你的分辨率太低,对于较低的情节,步骤(除了最后一个)在x中的1单位上发生,而步骤大约一个数量级。这会给出步骤的外观,而如果放大,您将看到垂直线具有非无限渐变(真正的步长随无限渐变而变化)。

这对于上图和下图都是同样的问题。我们可以使用step function轻松解决此问题。您通常会发现导入数据更容易,在本例中我使用强大的numpy genfromtxt。这会将数据加载为数组data

import numpy as np
import matplotlib.pylab as plt

data = np.genfromtxt('test.csv', delimiter=" ")

ax1 = plt.subplot(2,1,1)
ax1.step(data[:,0], data[:,1])

ax2 = plt.subplot(2,1,2)
ax2.step(data[:,0], data[:,2])

plt.show()

enter image description here

如果你是python的新手,那么可能有两件事需要提及,我们使用两个子图(ax1ax2)来绘制数据而不是绘制在同一个图上(这意味着你不需要添加值来空间分隔它们)。我们通过[]访问数组的元素,这使[column, row]的{​​{1}}意味着所有列,并且:的索引为i

答案 1 :(得分:0)

我建议将数据加载到numpy数组

import numpy as np
data = np.loadtxt('sample.csv')

而不是绘制它:

# first point
ax = [data[0,0]]
ay = [data[0,1]]

for i in range(1, data.shape[0]):
    if ay[-1] != data[i,1]: # if y value has changed
        # add current x and old y
        ax.append(data[i,0])
        ay.append(ay[-1])
        # add current x and current y
        ax.append(data[i,0])
        ay.append(data[i,1])

import matplotlib.pyplot as plt

plt.plot(ax,ay)
plt.show()

我的解决方案与您的不同之处在于,我为的每个更改绘制了两点。这两点产生90度弯曲。我只绘制第一条曲线。将第[?,1]更改为[?,2]

答案 2 :(得分:0)

感谢您的建议。经过一些研究,我能够绘制它,这是我的代码,

import csv
import datetime
import matplotlib.pyplot as plt
import numpy as np
import dateutil.relativedelta as rd
import bisect
import scipy as sp

fname = "output.csv"


portfolio_list = []
x = []
a = []
b = []

portfolio = csv.DictReader(open(fname, "r"))
portfolio_list.extend(portfolio)


for data in portfolio_list:
    x.append(data['i'])
    a.append(data['a'])
    b.append(data['b'])

stepList = [0, 1,2,3]

fig = plt.figure(figsize=(20, 10))
ax = fig.add_subplot(111)

plt.step(x, a, 'g', where='post')
plt.step(x, b, 'r', where='post')

plt.show()

得到了像这样的图像, enter image description here