gnuplot pm3d绘制三角形数据

时间:2013-06-17 18:33:06

标签: plot geometry gnuplot heatmap

我正在尝试在三角形表面上绘制热图,使用页面上显示的方法获得坐标和“热值”.aist.go.jp / a.noda/programs/ternary/ternary-en html的。

所以,我处理数据并获得以下形式的数据文件:

x y val

其中xy是介于0和1之间的值,val是一个整数,表示我需要显示的频率。

数据文件是:http://tinyurl.com/lqsqtvv

并且剧情脚本是这样的:

#!/usr/bin/gnuplot

reset

set terminal pngcairo size 640,480
set output 'heat_map_triangle.png'

set border linewidth 0
unset tics
set bmargin 3
set lmargin 3
set rmargin 3
set tmargin 3

set dgrid3d
set pm3d map
#set pm3d ftriangles
set pm3d interpolate 0,0
set pm3d at bs

set label 'Y' at 0, -0.03 center
set label 'Z' at 1, -0.03 center
set label 'X' at 0.5, 0.886 center

set style line 1 lt 1 lw 3 pt -1 ps 1

# x
set arrow 1 from 0,0 to 1, 0.0 nohead linestyle 1

# z
set arrow 11 from 1, 0 to 0.50, 0.866 nohead linestyle 1

# y
set arrow 21 from 0.50, 0.866 to 0,0 nohead linestyle 1

splot "./triangle.out" using 1:2:3

所以,我得出这个plot

这不是我想要的......

我无法理解如何告诉pm3d不要填充不在数据文件中的区域(例如三角形外)以及为什么三角形上边缘比热图更高。

有没有办法以我想要的方式绘制数据?

在pm3d文档中它说它可以留下空格,但是怎么样?

感谢

2 个答案:

答案 0 :(得分:2)

最终,为了让pm3d工作,gnuplot要求数据在某种网格“网格”上。网格需要由四边形组成,但这是唯一的规定。例如,您的网格点可以这样排列:

 1
        2
                 3
 4      5        6     10
                 9
        8
 7

在这种情况下,gnuplot将从点1-2-4-5和点2-3-5-6等创建四边形.Gnuplot将根据corners2color的{​​{1}}选项为四边形着色。 pm3d。默认情况下,它使用单元格角上4个值的平均值。

要将它放在数据文件中,您需要像这样的数据文件坐标:

 x1   y1   z1
 x2   y2   z2
 x3   y3   z3
 x10  y10  z10

 x4   y4   z4
 x5   y5   z5
 x6   y6   z6
 x10  y10  z10

 x7   y7   z7
 x8   y8   z8
 x9   y9   z8
 x10  y10  z10

请注意我是如何在数据之间的水平“扫描”之间留下一个空行。 (当然,我们可以构建数据文件以对数据进行垂直“扫描”)。我还在三角形的右顶点重复了一个点,给它一个尖锐的点。这不是绝对必要的,但我想证明这是可能的。

您的数据不是那种形式,通常,gnuplot会给您一个错误,抱怨您的数据没有网格化。但是,你已经添加了行set dgrid3d,它告诉gnuplot你的数据不在网格上,并且gnuplot应该使用反距离加权函数将数据插入到网格中。不幸的是,gnuplot创建了一个常规(矩形)网格,没有办法告诉它创建其他类型的网格。最终,您需要弄清楚如何将数据打成这种形式。

答案 1 :(得分:0)

如果您准备使用R和ggtern库,可以实现以下目标:

Output

使用以下代码完成了这项工作:

#Load library
library(ggtern)

#Load the data
df <- read.table("./data.txt")
colnames(df) = c("x","y","Value")

#Put in ternary coordinates
df.new <- data.frame(transform_cart_to_tern(data=df),Value=df$Value)
df.new <- df.new[order(df.new$Value),]
df.new <- df.new[which(df.new$Value > 0),]

#Plot the diagram
ggtern(data=df.new,aes(y=T,x=L,z=R)) + 
  geom_point(aes(color=Value,alpha=Value)) + 
  scale_color_gradient(low="transparent",high="red") + 
  guides(alpha="none") + 
  theme_rgbw() +
  theme(legend.position=c(0,1),legend.justification=c(0,1)) +
  labs(title="Example Density Plot",color="Frequency")