Как построить данные из двух разных наборов данных - PullRequest
0 голосов
/ 13 сентября 2018

Я пробирался через некоторые форумы, пытаясь решить эту проблему, но я новичок в программировании, и я просто не могу понять это.

У меня есть два набора данных с двумя столбцами (x,u) в data_a*.dat и (x,v) в data_b*.dat. Существует 200 файлов в диапазоне от data_a_001.dat до data_a_200.dat и data_b_001.da t до data_b_200.dat

Я пытаюсь создать набор сюжетов plot_001.png до plot_200.png такой, что plot_001 имеет x,u с data_a_001.da т, а также v с data_b_001.dat и так далее до plot_200.png

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

import numpy as np
import matplotlib
import math
from matplotlib import pyplot as plt
import glob

data = sorted(glob.glob('data_*'))
i=0
for d in data:
    if(i<201):
        data = np.genfromtxt(fname=d)
        x = data[:,0]
        v = data[:,1]
        plt.plot(x,v,color='blue')
        plt.ylim(-1.5,1.5)
        k = str(i)
        plt.savefig('plot'+k.zfill(4)+'.png')
        plt.close()
        i = i + 1
matplotlib.pyplot.show()

Я не против изменить код или просто попробовать что-то новое, чтобы решить проблему.

1 Ответ

0 голосов
/ 14 сентября 2018

Чтобы создать вторую линию, которая перекрывает первую линию на том же графике, снова используйте plot.plot(x,y) с x и y в качестве новых данных. Matplotlib добавит его к фигуре и обработает все остальное.

Ниже приведен пример того, как создать N изображений, каждое из которых содержит график ваших данных из a.dat и b.dat.

import numpy as np
import matplotlib
import math
from matplotlib import pyplot as plt
import glob

files_a = sorted(glob.glob('data_a*'))
files_b = sorted(glob.glob('data_b*'))

for i, d in enumerate(files_a):
    # get file and plot from data_a_i.png
    data_a = np.genfromtxt(fname=d)
    x = data_a[:,0]
    u = data_a[:,1]
    plt.plot(x,u,color='blue')

    # get file and plot from data_b_i.png
    data_b = np.genfromtxt(fname=files_b[i])
    x = data_b[:,0]
    v = data_b[:,1]
    plt.plot(x,v,color='red')

    # format plot and save
    plt.ylim(-1.5,1.5)
    k = str(i)
    plt.savefig('plot'+k.zfill(4)+'.png')

    # clear figure, can be re-used for other plots
    plt.clf()

Несколько замечаний:

  • В вашем случае рассмотрите возможность использования enumerate, а не просто петлю item in for. Перечисление (см. документация ) дает кортеж, содержащий текущий счетчик и значение, полученное при итерации по последовательности (в вашем случае, список).
  • Мой текущий подход не самый быстрый, поскольку он делает glob.glob дважды (для файлов A и B). Если вы знаете точные имена файлов или количество файлов, вы, безусловно, можете сделать это быстрее, открыв точные имена файлов, просто сопоставив регистр.
  • Я использовал plt.clf(), чтобы очистить созданную фигуру, чтобы ее можно было использовать повторно. Вы можете взглянуть на этот ответ stackoverflow о том, что он делает.
  • Я удалил plot.show(), так как предполагается, что вы просто хотите сохранить .png файлы.
  • Если вы не очистите график или не используете функцию, которая в бэк-энде очищает график, вы продолжите добавлять строки к тому же рисунку, в результате чего к концу получится 400 строк (200 a и 200 b) вашего участка.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...