我有两个Python脚本:第一个负责生成数据并将其保存在.csv文件中,第二个负责实时绘制此数据。我必须在控制台中运行第一个脚本,然后在控制台的新实例中运行第二个脚本。我想用一个脚本来做所有这些事情,但是我做不到。我尝试使用多处理,但失败了。我添加了2个脚本:
#THIS IS DATA GENERATING SCRIPT
import csv
import random
import time
import numpy as np
steps = 12000
shift = [-1, 0, 1]
start_corr_2D = [0, 0]
start_corr_3D = [0, 0, 0]
path_2D = np.zeros(shape=(steps,2))
path_3D = np.zeros(shape=(steps,3))
path_2D[0] = start_corr_2D
path_3D[0] = start_corr_3D
fieldnames = ["X", "Y"]
with open('data.csv', 'w') as csv_file:
csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
csv_writer.writeheader()
info = {
"X": start_corr_2D[0],
"Y": start_corr_2D[1],
}
csv_writer.writerow(info)
for i in range(1, steps):
with open('data.csv', 'a') as csv_file:
csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
shift_2D = [random.choice(shift), random.choice(shift)]
shift_3D = [random.choice(shift), random.choice(shift), random.choice(shift)]
next_corr_2D = list(map(sum, zip(start_corr_2D, shift_2D)))
next_corr_3D = list(map(sum, zip(start_corr_3D, shift_3D)))
print(next_corr_2D)
path_2D[i] = next_corr_2D
path_3D[i] = next_corr_3D
start_corr_2D = next_corr_2D
start_corr_3D = next_corr_3D
info = {
"X": next_corr_2D[0],
"Y": next_corr_2D[1],
}
csv_writer.writerow(info)
time.sleep(0.3)
#THIS SCRIPT IS RESPONSIBLE FOR PLOTTING IN REAL TIME
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.animation import FuncAnimation
j = 0
def animate(i):
data = pd.read_csv('data.csv')
xs = data['X']
ys = data['Y']
global j
j += 1
# print(j)
plt.cla()
# plt.scatter(xs, ys, c='red', marker='*')
if j < 10:
plt.plot(xs, ys, c='blue', lw=0.6)
elif j >= 10 and j < 50:
plt.plot(xs, ys, c='red', lw=0.6)
else:
plt.plot(xs, ys, c='green', lw=0.6)
plt.tight_layout()
ani = FuncAnimation(plt.gcf(), animate, interval=300)
plt.tight_layout()
plt.show()
但是我只想通过运行1个脚本来获得结果。我将不胜感激。
1。使用GNU并行:
parallel -j -8 python ::: "$python_plot_scripts"
2。您可以绘制多个无花果:multiple_figs_demo
from matplotlib.path import Path
import matplotlib.patches as patches
3。用途:pyhdf
多处理似乎是完成您要实现的目标的正确方法。但是,使用csv文件在两个进程之间进行通信非常危险。可以通过在两个过程之间使用队列将新数据发送到绘图来避免这种情况。
这是一个可能的实现(您可以将动画添加到其他文件中:
import csv
import random
import time
from multiprocessing import Process, Queue
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
def animate(q):
xs = [0]
ys = [1]
def _animate(i):
while not q.empty():
x, y = q.get()
xs.append(x)
ys.append(y)
plt.cla()
# plt.scatter(xs, ys, c='red', marker='*')
if i < 10:
plt.plot(xs, ys, c='blue', lw=0.6)
elif 10 <= i < 50:
plt.plot(xs, ys, c='red', lw=0.6)
else:
plt.plot(xs, ys, c='green', lw=0.6)
plt.tight_layout()
ani = FuncAnimation(plt.gcf(), _animate, interval=300)
plt.tight_layout()
plt.show()
def main():
steps = 12000
shift = [-1, 0, 1]
start_corr_2D = [0, 0]
start_corr_3D = [0, 0, 0]
path_2D = np.zeros(shape=(steps,2))
path_3D = np.zeros(shape=(steps,3))
path_2D[0] = start_corr_2D
path_3D[0] = start_corr_3D
fieldnames = ["X", "Y"]
data_queue = Queue()
plot_process = Process(target=animate, args=(data_queue,))
plot_process.start()
with open('data.csv', 'w') as csv_file:
csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
csv_writer.writeheader()
info = {
"X": start_corr_2D[0],
"Y": start_corr_2D[1],
}
csv_writer.writerow(info)
for i in range(1, steps):
with open('data.csv', 'a') as csv_file:
csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
shift_2D = [random.choice(shift), random.choice(shift)]
shift_3D = [random.choice(shift), random.choice(shift), random.choice(shift)]
next_corr_2D = list(map(sum, zip(start_corr_2D, shift_2D)))
next_corr_3D = list(map(sum, zip(start_corr_3D, shift_3D)))
path_2D[i] = next_corr_2D
path_3D[i] = next_corr_3D
start_corr_2D = next_corr_2D
start_corr_3D = next_corr_3D
info = {
"X": next_corr_2D[0],
"Y": next_corr_2D[1],
}
data_queue.put((next_corr_2D[0], next_corr_2D[1]))
csv_writer.writerow(info)
time.sleep(0.3)
plot_process.join()
if __name__ == '__main__':
main()