2014-11-06 2 views
2
#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++

enter image description here

Проблема заключается в том, что элемент "кадр [0] [0]" должен быть черным в этой цветовой палитре. И я полагаю, что он черный, но площадь между четырьмя точками окрашена в синий цвет (цвет для среднего значения этих четырех точек). Что я хочу, чтобы создать такое изображение: link to gnuplot heatmap example. Он на самом деле окрашивает матричный элемент, а не область между четырьмя элементами. Итак, как мне это сделать, используя C++ и iostream? Я могу печатать данные в файл, а затем строить из этого файла, но это может быть медленным ... Любые идеи?

ответ

0

Вы должны использовать стиль image черчения, просто как сделано в демо-странице вы связаны:

#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 autoscale fix\n"; 
    gp << "plot '-' with image\n"; 
    gp.send2d(frame); 
    gp.flush(); 
} 

я не могу проверить это прямо сейчас, но это необходимо сделать трюк. Возможно, вам нужно изменить часть set autoscale в соответствии с вашими потребностями. Использование set autoscale fix использует жесткие диапазоны для всех осей (x, y и цвет).

+1

Hi! Есть одна проблема. Send2d() отправляет отдельный столбец в gnuplot. «Image» не нравится и требует три столбца. Во всяком случае, пользователь обычно хочет передать x, y, цветовые координаты. Я также не уверен, как send2d() знает размер массива float. Также на веб-сайте говорится, что следует избегать простых массивов и предпочитать 'std :: vector' или подобное. См. Https://gitorious.org/gnuplot-iostream/pages/Datatypes – sweber

+0

Спасибо за комментарий, Кристоф! Я пробовал использовать «send1d()» и как-то это сработало! Но теперь он показывает график только после закрытия трубы iostream. И если я хочу выполнить ретрансляцию, мне нужно закрыть объект «Gnuplot» и создать новый, и это создаст новое окно графика. Кажется, мне нужно какое-то прекращение или что-то ... –

+0

@sweber Вы правы. Я не проверял формат, написанный 'send2d()'. Я думал, что если он подходит к splot, он должен поместиться и с изображением :) – Christoph

Смежные вопросы