gpt4 book ai didi

c++ - 将数据从 C++ 传递到 gnuplot 示例(使用 Gnuplot-iostream 接口(interface))

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:32:18 25 4
gpt4 key购买 nike

我刚刚接触到 Dan Stahlke 的 gnuplot C++ I/O 接口(interface),它使我免于“自己动手”。不幸的是,没有太多示例,也没有真正的文档。

我的 C++ 项目中有以下数据类型:

struct Data
{
std::string datestr; // x axis value
float f1; // y axis series 1
float f2; // y axis series 2
float f3; // y axis series 3
};


typedef std::vector<Data> Dataset;

我想从 C++ 传递一个 Dataset 变量,这样我就可以绘制数据(X 轴上的日期,以及 Y 轴上绘制为时间序列的 3 个数字)。

谁能告诉我如何将 Dataset 变量从 C++ 传输到 gnuplot(使用 Gnuplot-iostream 接口(interface))并使用传入的数据制作简单的绘图?

最佳答案

我最近向 git 推送了一个新版本,它可以很容易地支持像这样的自定义数据类型。支持你的struct Data ,您可以提供 TextSender 类的特化。这是一个完整的示例,使用您定义的结构。

#include <vector>#include "gnuplot-iostream.h"struct Data {    std::string datestr;  // x axis value    float f1;             // y axis series 1    float f2;             // y axis series 2    float f3;             // y axis series 3};typedef std::vector<Data> Dataset;namespace gnuplotio {    template<>    struct TextSender<Data> {        static void send(std::ostream &stream, const Data &v) {            TextSender<std::string>::send(stream, v.datestr);            stream << " ";            TextSender<float>::send(stream, v.f1);            stream << " ";            TextSender<float>::send(stream, v.f2);            stream << " ";            TextSender<float>::send(stream, v.f3);            // This works too, but the longer version above gives            // gnuplot-iostream a chance to format the numbers itself (such as            // using a platform-independent 'nan' string).            //stream << v.datestr << " " << v.f1 << " " << v.f2 << " " << v.f3;        }    };}int main() {    Dataset x(2);    // The http://www.gnuplot.info/demo/timedat.html example uses a tab between    // date and time, but this doesn't seem to work (gnuplot interprets it as    // two columns).  So I use a comma.    x[0].datestr = "01/02/2003,12:34";    x[0].f1 = 1;    x[0].f2 = 2;    x[0].f3 = 3;    x[1].datestr = "02/04/2003,07:11";    x[1].f1 = 10;    x[1].f2 = 20;    x[1].f3 = 30;    Gnuplot gp;    gp << "set timefmt \"%d/%m/%y,%H:%M\"\n";    gp << "set xdata time\n";    gp << "plot '-' using 1:2 with lines\n";    gp.send1d(x);    return 0;}

可以做类似的事情来支持以二进制格式发送数据。参见 example-data-1d.cc来自 git repo 的例子。

或者,可以通过覆盖 operator<<(std::ostream &, ...) 来支持像这样的自定义数据类型.

另一种选择是使用 std::tuple (在 C++11 中可用)或 boost::tuple而不是定义自己的结构。这些都是开箱即用的支持(好吧,现在他们是,他们不是在你问这个问题的时候)。

关于c++ - 将数据从 C++ 传递到 gnuplot 示例(使用 Gnuplot-iostream 接口(interface)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4705435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com