Как построить график из файла с помощью Python, проблема соединения линий - PullRequest
1 голос
/ 01 октября 2019

Я новичок в python и у меня есть вопрос. У меня есть файл file.csv, который содержит два столбца.

FILE.csv

0.0000    9.0655
0.0048    9.0640
0.0096    9.0592
0.0144    9.0510
0.0192    9.0392
0.0240    9.0233
0.0288    9.0028
0.0336    8.9770
0.0384    8.9451
0.0432    8.9063
0.0480    8.8595
0.0528    8.8039
0.0576    8.7385
0.0624    8.6626

0.0000   11.0013
0.0048   11.0018
0.0096   11.0032
0.0144   11.0057
0.0192   11.0091
0.0240   11.0134
0.0288   11.0186
0.0336   11.0247
0.0384   11.0317
0.0432   11.0394
0.0480   11.0478
0.0528   11.0569
0.0576   11.0666
0.0624   11.0767
0.0672   11.0873

Я попытался построить график из FILE.csv с помощью xmgrace и Gnuplot, и результат оченьубедительно.

У меня есть две линии на графике, как показано на рисунке ниже: введите описание изображения здесь введите описание изображения здесь

С другой стороны, если я использую свой скрипт на python, соединяются две строки вот мой скрипт:

import matplotlib.pyplot as plt
import pylab as plt
#
with open('bb.gnu') as f:
    f=[x.strip() for x in f if x.strip()]
    data=[tuple(map(float,x.split())) for x in f[2:]]
    BX1=[x[0] for x in data]
    BY1=[x[1] for x in data]

plt.figure(figsize=(8,6))
ax = plt.subplot(111)

plt.plot(BX1, BY1, 'k-', linewidth=2 ,label='Dos')
plt.plot()
plt.savefig("Fig.png", dpi=100)
plt.show()

И вот результат введите описание изображения здесь

Мой вопрос, существует ли решение для построения графа с помощью Python, не создавая соединение между двумя линиями. Чтобы найти аналогичные результаты для Gnuplot и xmgrace.

Заранее благодарим за помощь.

1 Ответ

2 голосов
/ 03 октября 2019

Насколько мне известно, matplotlib объединяет только две ваши кривые, потому что вы предоставляете их как один набор данных. Это означает, что вам нужно вызвать plot дважды, чтобы сгенерировать две кривые. Я поместил ваши данные в файл с именем data.csv и написал следующий фрагмент кода:

import numpy
import matplotlib.pyplot as plt

data = numpy.genfromtxt('data.csv')
starts = numpy.asarray(data[:, 0] == 0).nonzero()[0]
fig, ax = plt.subplots(nrows=1, ncols=1, num=0, figsize=(16, 8))
for i in range(starts.shape[0]):
    if i == starts.shape[0] - 1:
        ax.plot(data[starts[i]:, 0], data[starts[i]:, 1])
    else:
        ax.plot(data[starts[i]:starts[i + 1], 0],
                data[starts[i]:starts[i + 1], 1])
plt.show()

, который генерирует эту цифру

enter image description here

Что я делаю с starts, так это то, что я ищу строки в первом столбце данных, которые содержат значение 0, которое я считаю началом новой кривой. Затем цикл генерирует кривую на каждой итерации. Оператор if различает последнюю кривую и другие. Возможно, он более элегантный, но он работает.

Кроме того, не импортируйте pylab, его не рекомендуется использовать из-за ненужного заполнения пространства имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...