ось рассеяния и галочки в matplotlib.pyplot

#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
 

И результат выглядит так:
SOR2_Scatter

Комментарии:

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

Сюжет о пандах SOR2