在Gnuplot中绘制一组点和线

5

我认为对于已经使用gnuplot和"splot"命令的人来说,这可能是一个非常简单的问题,但是由于这是我第一天使用该程序,我现在无法弄清楚。

我成功将我的C++项目链接到gnuplot,因此我能够创建一个具有以下格式的Datafile.dat:

# Xcoord Ycoord Zcoord
1 2 1
2 1 1
3 1 1
3 2 2
3 3 3

在我的C++文件中,我这样做:

#include "gnuplot.h"
#include <iostream>
using namespace std;
int main() {
    Gnuplot plot;
    plot("set border 4095");
    plot("splot \"C:/\\Users/\\lRaulMN/\\Desktop/\\Datafile.dat\" with lines");
    return 0;
}

这个代码运作的非常完美,我得到了下面这个结果:

View

现在的问题是:在使用这5个点的情况下,是否有任何方法可以拆分这些数字而不必创建Datafile.dat文件?

因为将来我的代码可能会像这样:

#include "gnuplot.h"
#include <iostream>
#include <vector>
using namespace std;
typedef struct {
    double Time;
    double X;
    double Y;
    double Z;
} DimensionalPoint;

int main() {
    Gnuplot plot;
    plot("set border 4095"); 
    vector<DimensionalPoint> test;
    plot("splot \"C:/\\Users/\\lRaulMN/\\Desktop/\\Datafile.dat\" with lines");
    return 0;
}

我的想法是用数字填充测试向量(在我的C++代码中计算),然后以某种方式调用splot并表示这些数字。

我首先想到的方法是创建一个包含数字的文件(在执行C++项目时),然后将“splot”应用于该文件,但是对于每个交互我都需要创建很多文件(因为我将有多个向量),我不想使用这种解决方案。

我想,可能没有一种超级简单的方法将3D点的向量插入gnuplot中,但是只要我知道如何使用X、Y和Z坐标至少“splot”两个数字,我就可以解决这个问题。


1
如果您有Gnuplot 5+版本,您可以将数据内联。您可以在此处查看示例:https://dev59.com/5nA75IYBdhLWcg3wZ4Fr#33064653 - Thor
2
也许相关:https://dev59.com/EVPTa4cB1Zd3GeqPjHDX - Bob__
谢谢大家。我在那些链接中找到了很多信息。我会回答解决方案,但你们帮了我很多!昨天我找不到相关的问题^^' - Rauññ
1个回答

3

感谢@Thor和@Bob,我找到了解决方案。

首先我创建了一个“doubletoString”方法:

string doubletoString(double value) {
    std::ostringstream origin;
    origin << value;
    std::string str = origin.str();
    return str;
}

那么我创建几个3D点只是为了尝试。

vector<DimensionalPoint> test;
DimensionalPoint A, B, C, D;
A.X = 1; A.Y = 1; A.Z = 1;
B.X = 2; B.Y = 2; B.Z = 3;
C.X = 1.2; C.Y = 2.4; C.Z = 2.3;
D.X = 8; D.Y = 3; D.Z = 1;
test.push_back(A);
test.push_back(B);
test.push_back(C);
test.push_back(D);

然后,我将这些消息发送给GNUplot。

plot("set border 4095");
plot("$DATA << EOD"); 
double Xaux, Yaux, Zaux;
for (int i = 0; i < test.size(); i++) {
    Xaux = test.at(i).X;
    Yaux = test.at(i).Y;
    Zaux = test.at(i).Z;        
    plot(doubletoString(Xaux) + " " + doubletoString(Yaux) + " " + 
    doubletoString(Zaux));
}
plot("EOD");
plot("splot $DATA with lines");

执行代码后,这是生成的图表结果。

GNUplot生成的图表


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接