1

我是 matplotlib 的新手。我正在尝试绘制阶跃函数并遇到一些麻烦。现在我可以从文件中读取并绘制它,如下所示。但是顶部的图表不是步骤,下面的图表不是正确的步骤。我看到了通过给出 x 和 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 和 2,以便该图可以出现在顶部,另一个 y 轴 2 值 0 和 1 以便它出现在底部,如下所示


现在看起来的波形 在此处输入图像描述

4

3 回答 3

1

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

对于顶部图和底部图,这是相同的问题。我们可以使用step函数轻松解决这个问题。您通常会发现导入数据更容易,在此示例中,我使用强大的numpygenfromtxt。这会将数据加载为数组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()

在此处输入图像描述

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

于 2013-09-18T10:37:38.813 回答
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()

得到了这样的图像, 在此处输入图像描述

于 2013-09-18T15:27:38.627 回答
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()

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

于 2013-09-18T09:57:03.340 回答