【问题标题】:gnuplot pm3d plot triangle datagnuplot pm3d 绘制三角形数据
【发布时间】:2013-06-17 18:33:05
【问题描述】:

我正在尝试在三角形表面上绘制热图,坐标和“热值”是通过页面 staff.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 文档中它说它可以留下空白,但是如何?

谢谢

【问题讨论】:

    标签: plot geometry gnuplot heatmap


    【解决方案1】:

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

     1
            2
                     3
     4      5        6     10
                     9
            8
     7
    

    在这种情况下,gnuplot 将从点 1-2-4-5 和点 2-3-5-6 等创建一个四边形。Gnuplot 将根据 corners2color 选项的 @987654324 为四边形着色@。默认情况下,它使用单元格角上 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 创建了一个规则(矩形)网格,没有办法告诉它创建其他类型的网格。最终,您需要弄清楚如何将您的数据转换成这种形式。

    【讨论】:

    • 首先,你例子中的z坐标是热值吗?因为如果是这样的话,数据文件的转换可以很容易,我现在正在尝试!
    • @mellotanica -- z 坐标可以是热值。或者,它们可以是 z 坐标,然后您需要一个额外的字段用于热值。 (然后你会在表面上绘制热值——不过我认为这不是你想要的)
    • 不,这不是我的情况,我正在按照你之前展示的方式工作。顺便问一下,有没有办法让 gnuplot “删除”一些绘图区域?
    • @mellotanica -- 您可以set datafile missing "nan" 然后将nan 值放入数据中应该“删除”的位置
    • 好的,这几乎和我的想法一样,this is the result,我将数据文件排序为两组平行的对角线,它们在图形中很明显,但我不是这么关心他们。非常感谢!
    【解决方案2】:

    如果您准备使用 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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 1970-01-01
      相关资源
      最近更新 更多