#include <vector>
#include <cmath>
#include <boost/tuple/tuple.hpp>
#include "gnuplot-iostream.h"
int main()
{
float frame[4][4];
for (int n=0; n<4; n++)
{
for (int m=0; m<4; m++)
{
frame[n][m]=n+m;
}
}
Gnuplot gp;
gp << "unset key\n";
gp << "set pm3d\n";
gp << "set hidden3d\n";
gp << "set view map\n";
gp << "set xrange [ -0.500000 : 3.50000 ] \n";
gp << "set yrange [ -0.500000 : 3.50000 ] \n";
gp << "splot '-'\n";
gp.send2d(frame);
gp.flush();
}
Это создает мне изображение:Plotting Heatmap с Gnuplot в C++
Проблема заключается в том, что элемент "кадр [0] [0]" должен быть черным в этой цветовой палитре. И я полагаю, что он черный, но площадь между четырьмя точками окрашена в синий цвет (цвет для среднего значения этих четырех точек). Что я хочу, чтобы создать такое изображение: link to gnuplot heatmap example. Он на самом деле окрашивает матричный элемент, а не область между четырьмя элементами. Итак, как мне это сделать, используя C++ и iostream? Я могу печатать данные в файл, а затем строить из этого файла, но это может быть медленным ... Любые идеи?
Hi! Есть одна проблема. Send2d() отправляет отдельный столбец в gnuplot. «Image» не нравится и требует три столбца. Во всяком случае, пользователь обычно хочет передать x, y, цветовые координаты. Я также не уверен, как send2d() знает размер массива float. Также на веб-сайте говорится, что следует избегать простых массивов и предпочитать 'std :: vector' или подобное. См. Https://gitorious.org/gnuplot-iostream/pages/Datatypes – sweber
Спасибо за комментарий, Кристоф! Я пробовал использовать «send1d()» и как-то это сработало! Но теперь он показывает график только после закрытия трубы iostream. И если я хочу выполнить ретрансляцию, мне нужно закрыть объект «Gnuplot» и создать новый, и это создаст новое окно графика. Кажется, мне нужно какое-то прекращение или что-то ... –
@sweber Вы правы. Я не проверял формат, написанный 'send2d()'. Я думал, что если он подходит к splot, он должен поместиться и с изображением :) – Christoph