我正在尝试在三角形表面上绘制热图,使用页面上显示的方法获得坐标和“热值”.aist.go.jp / a.noda/programs/ternary/ternary-en html的。
所以,我处理数据并获得以下形式的数据文件:
x y val
其中x
和y
是介于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文档中它说它可以留下空格,但是怎么样?
感谢
答案 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库,可以实现以下目标:
使用以下代码完成了这项工作:
#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")