Po pierwsze lepiej użyć subprocess.run zamiast tworzyć goły Popen.
shell=True generalnie ułatwia życie, bo wtedy jako cmd podajesz string dokładnie tego co byś wpisał w konsole, ale powinno się unikać w kodzie produkcyjnym, bo problemy bezpieczeństwa i program jest zależny od zmiennej środowiskowej shell ustawionej u użytkownika. Wiecej tutaj.
Dla shell=False musisz podać liste, w której pierwszy element to komenda a reszta to argumenty. Zadanie bardzo ułatwia funkcja shelx.split, która odpowiednio rozbija string. W dokumentacji jest ładny przykład:
https://docs.python.org/3/library/subprocess.html#subprocess.Popen
Ale mi wydaje się, że po prostu źle korzystasz z gnuplota :D
Jeśli chcesz wykonać skrypt to po prostu: gnuplot skrypt.gpl
Jeśli zależy Ci, żeby wyrysowany wykres wyświetlił sie to argument --persist (-p).
Możesz też podać gnuplotowi komendy w ten sposob:
gnuplot -e "command1; command2; ..."
A subprocess najlepiej wołać tak:
result = subprocess.run(shlex.split('to co bys wpisal w konsole'))
i w resulcie masz obiekt CompletedProcess, który ma m.in stdout, stderr, returncode.