#python #arrays #numpy #matplotlib #errorbar
#python #массивы #numpy #matplotlib #панель ошибок
Вопрос:
У меня есть список координат и их соответствующие значения ошибок в форме:
# Graph from standard correlation, page 1
1.197 0.1838 -0.03504 0.07802 -0.006464 0.004201
1.290 0.2072 -0.04241 0.05380 -0.005833 0.008101
где столбцы обозначают x,y,lefterror,righterror,buttomerror,toperror
, что я загружаю файл как error=np.genfromtxt("standard correlation.1",skip_header=1)
и, наконец, я пытаюсь отобразить это как
xerr=error[:,2:4]
yerr=error[:,4:]
x=error[:,0]
y=error[:,1]
plt.errorbar(x,y,xerr=xerr,yerr=yerr,fmt='')
Который кричит ValueError: setting an array element with a sequence.
, когда я пытаюсь его запустить, я понимаю, что эта ошибка возникает, когда вы передаете объект, такой как список, в аргумент, который ожидает объект numpy array, я не знаю, как мне решить эту проблему, поскольку np.genfromtxt всегда должен возвращать ndarray .
Спасибо за вашу помощь.
Редактировать: я изменил файл, чтобы удалить символ ‘ ‘, так как чтение ‘ -‘ привело бы к значениям NaN в нижнем столбце ошибок, но я все равно получаю ту же ошибку.
Комментарии:
1. С принтами
error
. Также покажите нам егоshape
иdtype
. При использованииgenfromtxt
рекомендуется посмотреть, что он создает, прежде чем пытаться его использовать.2. используя
print np.shape(x),np.shape(y),np.shape(xerr),np.shape(yerr), type(datos)
I get(30,) (30,) (30, 2) (30, 2) <type 'numpy.ndarray'>
также, ошибка находится в строке из plt.errorbar(), которую я указал выше
Ответ №1:
Благодаря hpaulj я заметил, что форма полос ошибок была (30,2), однако plt.errobar()
ожидается, что ошибки будут в форме (2, n), поскольку python обычно транспонирует матрицы в аналогичных операциях и автоматически избегает этой проблемы. Я подумал, что это тоже сделает, но я решил изменить строки следующим образом:
xerr=error[:,2:4]
yerr=error[:,4:]
в
xerr=np.transpose(error[:,2:4])
yerr=np.transpose(error[:,4:])
что заставило скрипт работать правильно, хотя я до сих пор не понимаю, почему предыдущий код выдал мне такую ошибку, если кто-нибудь может помочь мне прояснить это, я буду признателен.
Ответ №2:
Форма массива, который numpy ожидает для отдельных строк ошибок, такова (2, N)
. Поэтому вам также необходимо транспонировать свой массив error[:,2:4].T
, matplotlib.errorbar
понимая эти значения относительно данных. Если x
это значение и (xmin, xmax)
соответствующая ошибка, строка ошибок переходит от x-xmin
к x xmax
. Поэтому у вас не должно быть отрицательных значений в массивах errorbar.
import numpy as np
import matplotlib.pyplot as plt
f = "1 0.1 0.05 0.1 0.005 0.01"
" 1.197 0.1838 -0.03504 0.07802 -0.006464 0.004201 "
" 1.290 0.2072 -0.04241 0.05380 -0.005833 0.008101"
error=np.fromstring(f, sep=" ").reshape(3,6)
print error
#[[ 1. 0.1 0.05 0.1 0.005 0.01 ]
# [ 1.197 0.1838 -0.03504 0.07802 -0.006464 0.004201]
# [ 1.29 0.2072 -0.04241 0.0538 -0.005833 0.008101]]
xerr=np.abs(error[:,2:4].T)
yerr=np.abs(error[:,4:].T)
x=error[:,0]
y=error[:,1]
plt.errorbar(x,y,xerr=xerr,yerr=yerr,fmt='')
plt.show()
Что касается ошибки значения, возможно, она была вызвана -
проблемой.