2013-09-18 3 views
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 так, что этот граф может иметь место в верхней части и другой у -axis2 значения 0 & 1 так, что он приходит в нижней части, как показано ниже


Waveform, как это ло OKS Теперь enter image description here

+0

Томас, вы особенно хотите построить данные из файла CSV или вы пытаетесь чтобы вообще построить функцию шага? – Greg

ответ

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

Что мое решение отличается от вашей, что я сюжет 2 пункт для все изменения в y. Эти две точки производят этот поворот на 90 градусов. Я рисую только первую кривую. Изменить [?,1] на [?,2] для второго.

1

По сути, ваше разрешение слишком низкое, для нижнего графика шаги (кроме последнего) происходят за 1 единицей в x, а шаги примерно на порядок больше. Это дает вид шагов, а если вы увеличите масштаб, вы увидите, что вертикальные линии имеют бесконечный градиент (истинные шаги изменяются с помощью бесконечного градиента).

Это та же проблема для верхних и нижних графиков. Мы можем легко исправить это, используя 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, то есть может быть две вещи, говоря, мы используем два подзаговоры (ax1 и ax2) для построения графика данных, а чем построение графика на одном и том же участке (это означает, что вам не нужно будет добавлять значения для их пространственного разделения). Мы получаем доступ к элементам массива через [] это дает [column, row] с : обозначающими всеми столбцами и и индекс i являющегося ith столбца

+0

В качестве дополнительной заметки вы можете управлять расположением шага относительно ваших данных с помощью 'where' kwarg. См. Http://stackoverflow.com/questions/12841847/step-function-in-matplotlib/12846384#12846384 – tacaswell

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

Смежные вопросы