Как получить одинаковые оси в gnuplot при вызове из скрипта - PullRequest
0 голосов
/ 28 мая 2020

При запуске gnuplot из командной строки можно получить одинаковые оси (так, чтобы между 0 и 1 по оси x было столько пикселей, сколько между 0 и 1 по оси y; не путать с соотношением сторон 1) через

gnuplot> set view equal xy

( трехмерные графики splot с одинаковым масштабом по x, y, z ). Однако я вызываю gnuplot из c ++ скрипта и сохраняю график как файл postscript. Приведенная выше команда не работает в моем сценарии, но я полагаю, что существует соответствующая команда для точечного синтаксиса . Мой сценарий c ++ показан ниже. Как получить одинаковые оси?

#include <cmath>
#include "gnuplot_i.hpp"
int main() {
    Gnuplot plt("ellipse");
    plt.savetops("ellipse");
    //plt.set_view_equal_xy;   // <- This does not work. What does work?
    double ax = -10.1;
    double ay = 17.4;
    double bx = 8.8;
    double by = 5.1;
    double a = sqrt(pow(ax, 2) + pow(ay, 2));
    double b = sqrt(pow(bx, 2) + pow(by, 2));
    double angle = atan2(ay, ax);
    double pi = 3.1415926536;
    double N = 100;
    double phi;
    // ellipse
    std::vector<double> x1, y1;
    for (int i = 0; i <= N; i++) {
        phi = 2*pi * (i/N);
        x1.push_back(cos(angle)*a*cos(phi)-sin(angle)*b*sin(phi));
        y1.push_back(sin(angle)*a*cos(phi)+cos(angle)*b*sin(phi));
    }
    plt.set_style("lines").plot_xy(x1, y1);
    // half axis a
    std::vector<double> x2, y2;
    x2.push_back(0);
    x2.push_back(ax);
    y2.push_back(0);
    y2.push_back(ay);
    plt.set_style("lines").plot_xy(x2, y2);
    // half axis b
    std::vector<double> x3, y3;
    x3.push_back(0);
    x3.push_back(bx);
    y3.push_back(0);
    y3.push_back(by);
    plt.set_style("lines").plot_xy(x3, y3);
    return 0;
}
...