Кривая фитинга в питоне - PullRequest
2 голосов
/ 03 марта 2011

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

Может кто-нибудь сказать мне, что я должен сделать, чтобы получить линию в масштабе журнала?

У меня есть файл, имеющий три столбца;Частота, мощностьСигнал питания .. Вот часть того, что я написал для построения графика и данных ..

#initialize all variables to 0

#open the data file

while 1:
  ln = datafile.readline()
  if ln:
    data = ln.split()
    x = float(n)
    y = float(data[0])
    z = float(data[1])
    xval.append(float(n))
    yval.append(y)
    zval.append(z)
    n += 1
    sum_z += z
    sum_y += y
    sum_y_squared += y*y
    sum_yz += y*z
  else:
    break
datafile.close()

# calculate slope and intercept using formulae
for num in xval:
    res = intercept + slope*num
    line.append(res)

#Plot data
pylab.figure(0)
matplotlib.pylab.loglog(yval,zval)

#Plot line
pylab.figure(0)
pylab.plotloglog(line)

Ответы [ 2 ]

2 голосов
/ 03 марта 2011

Как я понимаю вашу проблему, вы хотите построить две линии на одной диаграмме. Вот как это вообще делается:

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(line1_x, line1_y)
ax.plot(line2_x, line2_y)
ax.set_yscale("log")

Итак, сначала вы помещаете их в одинаковые Axes, чтобы они отображались на одной диаграмме. Чтобы изменить масштабирование, вы можете использовать set_xscale и set_yscale соответственно.

Кроме того, я не могу не заметить, что ваш код для чтения файла ужасен. Как @Bernhard предлагает в своем ответе, попробуйте использовать numpy.loadtxt. Это может выглядеть так:

data = numpy.loadtxt("data.txt")
n = len(data)
x = numpy.arange(n)
sum_z = sum(data.T[1])
sum_y = sum(data.T[0])
sum_y_squared = sum(data.T[0]**2)
sum_yz = sum(data.T[0]*data.T[1])

Это должно дать вам те же результаты, что и ваш цикл, только он гораздо более краткий. Я настоятельно рекомендую вам прочитать Предварительное руководство по NumPy , так как оно объясняет множество действительно интересных функций numpy массивов.

2 голосов
/ 03 марта 2011

Несмотря на то, что команды построения линии не верны в вашем примере, я предполагаю, что это похоже на то, что вы на самом деле делаете.

Вторая команда графика строит график в другом диапазоне x:

loglog(yval,zval) # plot  yval vs zval
loglog(line) #  plots range(0,len(line)) vs line

Также вы посмотрите на значения строки, имеют ли они смысл, находятся ли они в том же диапазоне, что и yval, zval?

Кроме того, вы можете использовать numpy.loadtxtзагрузить файл данных.

...