2014-11-06 111 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(); 
} 

这产生我的图像绘制热图:与++的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

嗨!有一个问题。 send2d()发送一个单列到gnuplot。 '图像'不喜欢它,需要三列。总之,用户通常也想通过x,y,颜色坐标。我也不确定send2d()如何知道float数组的大小。此外,该网站指出,应避免简单的数组,并喜欢'std :: vector'或类似。 见https://gitorious.org/gnuplot-iostream/pages/Datatypes – sweber 2014-11-06 11:40:33

+0

感谢您的评论,克里斯托夫!我尝试使用“send1d()”,并以某种方式它的工作!但现在它只在关闭iostream管道后显示图形。如果我想重新绘制,我必须关闭“Gnuplot”对象并创建一个新对象,并创建一个新的绘图窗口。这似乎是我需要一些终止或卑鄙...... – 2014-11-06 12:06:45

+0

@sweber你是对的。我没有检查'send2d()'写的格式。我认为如果它适合污点它应该适合也与图像:) – Christoph 2014-11-06 12:20:55