[C++] 297 FLTK : ChatGPTアプリの製作 その26 CSVデータのグラフ化

[M1 Mac, Monterey 12.6.3, clang 13.0.0, FLTK 1.3.8, ChatGPT API(gpt-3.5-turbo), NO IDE]

ChatGPT APIの混雑状況を調べるため不定期で定型質問を送信し、回答時間をCSVファイルに記録しています。

CSVファイルの内容を回答取得後、自動的にグラフ化しGUIに表示するようにしました。

グラフを見ると左側のピークは昨日金曜の深夜なので、最新データを測定した土曜の夜はかなり空いていることが分かります。

C++コードは以下のプロンプトでgpt-3.5-turboに作成させました。泥沼にハマることも多いのですが、今回は一発で成功です。

以下のコードをC++で書いて下さい。
1.csvファイルを読み込み、折れ線グラフを作成し、pngファイルとして保存する。
2.csvファイルの0列目はdatetime(23/01/01 00:00:00)、1列目はfloat型データ、2列目は文字列(読み込まない)。
3.0列目をx軸、1列目をy軸にプロットする。
4.pngのサイズは 256pix * 256pixとする。
5.グラフの背景は白色、折れ線はマゼンタとする。
6.グラフの周りに10pixelの余白を設ける。
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <cmath>
#include <cairo/cairo.h>

using namespace std;

int main() {
    // csvファイルの読み込み
    ifstream file("1.csv");
    if (!file.is_open()) {
        cerr << "Error: file not found" << endl;
        return 1;
    }

    vector<double> x, y;
    string line;
    getline(file, line); // ヘッダー行を読み飛ばす
    while (getline(file, line)) {
        stringstream ss(line);
        string datetime, value, label;
        getline(ss, datetime, ',');
        getline(ss, value, ',');
        getline(ss, label, ',');
        x.push_back(stod(datetime));
        y.push_back(stod(value));
    }
    file.close();

    // グラフの描画
    int width = 256, height = 256;
    cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
    cairo_t* cr = cairo_create(surface);

    // 背景を白色に設定
    cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
    cairo_paint(cr);

    // グラフの描画領域を設定
    cairo_translate(cr, 10, 10);
    cairo_scale(cr, (width - 20) / (x.back() - x.front()), (height - 20) / (*max_element(y.begin(), y.end()) - *min_element(y.begin(), y.end())));

    // 折れ線を描画
    cairo_set_source_rgb(cr, 1.0, 0.0, 1.0);
    cairo_set_line_width(cr, 1.0);
    cairo_move_to(cr, x.front(), y.front());
    for (int i = 1; i < x.size(); i++) {
        cairo_line_to(cr, x[i], y[i]);
    }
    cairo_stroke(cr);

    // pngファイルとして保存
    cairo_surface_write_to_png(surface, "graph.png");

    // 後処理
    cairo_destroy(cr);
    cairo_surface_destroy(surface);

    return 0;
}