[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;
}