Как построить данные из двух разных наборов данных

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

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

Я пытаюсь создать набор сюжетов plot_001.png в plot_200.png таким образом, что plot_001 имеет x,u от data_a_001.dat, а также 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()

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

Добро пожаловать в StackOverflow! Будет очень полезно, если вы предоставите образец своих данных, полученный график и графики, которые вы пытаетесь получить.

Teoretic 13.09.2018 21:39

Я не уверен, что правильно понимаю вопрос, но, как правило, если вы просто выполняете plt.plot(x1,y1); plt.plot(x2,y2); plt.show(), тогда оба набора данных появляются в результирующем графике.

aquirdturtle 13.09.2018 21:41
1
2
53
1

Ответы 1

Чтобы создать вторую линию, которая перекрывает первую линию на том же графике, снова используйте 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. Enumerate (см. документация) дает кортеж, содержащий текущий счетчик и значение, полученное в результате итерации по последовательности (в вашем случае, список).
  • Мой текущий подход не самый быстрый, поскольку он выполняет glob.glob дважды (для обоих файлов A и B). Если вы знаете точные имена или количество файлов, вы определенно можете сделать это быстрее, открыв точные имена файлов с учетом регистра.
  • Я использовал plt.clf(), чтобы очистить созданную фигуру, чтобы ее можно было использовать снова. Вы можете взглянуть на этот ответ stackoverflow, чтобы узнать, что он делает.
  • Я удалил plot.show(), поскольку предполагалось, что вы просто хотите сохранить файлы .png.
  • Если вы не очищаете график или не используете функцию, которая в бэкенде очищает график, вы продолжите добавлять строки к той же фигуре, что приведет к 400 строкам (200 a и 200 b) к концу вашего графика. .

Другие вопросы по теме