我是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,使其位于底部,如下所示
现在看起来波形
答案 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()
如果你是python的新手,那么可能有两件事需要提及,我们使用两个子图(ax1
和ax2
)来绘制数据而不是绘制在同一个图上(这意味着你不需要添加值来空间分隔它们)。我们通过[]
访问数组的元素,这使[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()
得到了像这样的图像,