#python #matplotlib
Вопрос:
В настоящее время я выполняю домашнее задание по численному анализу. Я использую python для анализа влияния значений различных параметров (которые w
указаны в коде) backward error
на алгоритм. Я хочу использовать matplotlib.pyplot
для построения разброса, чтобы показать результат. Но, похоже, разброс не похож на то, что я хочу.
Как вы можете видеть на рисунке, значения по оси y не возрастают снизу вверх, они распределяются случайным образом, и все точки кажутся находящимися на одной линии. Я перепробовал множество методов, чтобы исправить это, но потерпел неудачу.
Вот неправильный фрагмент кода и файл данных «SOR2».
import matplotlib.pyplot as plt
import numpy as np
# read SOR2
SOR2 = open("SOR2", 'r')
w = []
e = []
for line in SOR2:
data = line.strip().split()
w.append(data[0])
e.append(data[1])
SOR2.close()
# plot scatter
plt.xlabel("w")
plt.ylabel("backward error")
plt.scatter(w, e)
plt.show()
Данные в файле «SOR2», левый столбец w
, а правый столбец backward error
:
0.50 1.05549
0.51 1.01085
0.52 0.96795
0.53 0.92669
0.54 0.88701
0.55 0.84883
0.56 0.81210
0.57 0.77676
0.58 0.74274
0.59 0.70999
0.60 0.67847
0.61 0.64811
0.62 0.61889
0.63 0.59075
0.64 0.56366
0.65 0.53758
0.66 0.51247
0.67 0.48829
0.68 0.46502
0.69 0.44263
0.70 0.42107
0.71 0.40034
0.72 0.38039
0.73 0.36120
0.74 0.34276
0.75 0.32503
0.76 0.30799
0.77 0.29163
0.78 0.27592
0.79 0.26084
0.80 0.24638
0.81 0.23251
0.82 0.21921
0.83 0.20648
0.84 0.19429
0.85 0.18263
0.86 0.17148
0.87 0.16083
0.88 0.15067
0.89 0.14097
0.90 0.13173
0.91 0.12293
0.92 0.11457
0.93 0.10662
0.94 0.09908
0.95 0.09193
0.96 0.08516
0.97 0.07876
0.98 0.07272
0.99 0.06702
1.00 0.06166
1.01 0.05663
1.02 0.05190
1.03 0.04748
1.04 0.04335
1.05 0.03950
1.06 0.03599
1.07 0.03276
1.08 0.02977
1.09 0.02699
1.10 0.02442
1.11 0.02208
1.12 0.01993
1.13 0.01794
1.14 0.01609
1.15 0.01438
1.16 0.01280
1.17 0.01139
1.18 0.01009
1.19 0.00890
1.20 0.00791
1.21 0.00706
1.22 0.00630
1.23 0.00560
1.24 0.00498
1.25 0.00441
1.26 0.00402
1.27 0.00384
1.28 0.00434
1.29 0.00514
1.30 0.00610
1.31 0.00723
1.32 0.00856
1.33 0.01013
1.34 0.01196
1.35 0.01408
1.36 0.01655
1.37 0.01940
1.38 0.02268
1.39 0.02645
1.40 0.03077
1.41 0.03571
1.42 0.04133
1.43 0.04773
1.44 0.05498
1.45 0.06319
1.46 0.07246
1.47 0.08291
1.48 0.09466
1.49 0.10786
Комментарии:
1. Я думаю , что вам нужно преобразовать свои данные в
float
, иначе они просто останутся строками, когда вы их прочитаете. Использоватьw.append(float(data[0]))
и аналогично дляe
.2. Да, это и есть причина! Большое спасибо! @krm
Ответ №1:
Как прокомментировал @krm, data
необходимо преобразовать в float
:
w.append(float(data[0]))
e.append(float(data[1]))
В качестве альтернативы вы можете использовать pandas, чтобы упростить весь синтаксический анализ и построение графиков до 2 строк с pandas.read_fwf()
и DataFrame.plot.scatter()
:
import pandas as pd
df = pd.read_fwf('SOR2', header=None, names=['w', 'e'])
df.plot.scatter(x='w', y='e', ylabel='backward error')