用不同的列/线宽绘制热图

时间:2019-05-08 07:09:42

标签: gnuplot

我正在模拟某些东西,想弄清楚两个参数的影响。因此,我将它们都改变了,并在每对参数值上寻找结果,并得到如下结果:

void main() {
  SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
    systemNavigationBarColor: Colors.blue, // navigation bar color
    statusBarColor: Colors.pink, // status bar color
  ));
}

为使它们可视化,我使用gnuplot创建了一个热图,该图工作得非常好,可以显示颜色和高度:

  0  1000  2000  3000  4000  5000  ....
0  13.2  14.8  19.9  25.5  27.3 ...
1000  21.3  25.9  32.3 etc.
2000  etc.
3000
4000
....

现在,我想在热图上的某些区域上看起来更加详细,并以100的差异而不是上表所示的1000来更改参数。但是由于仿真需要很长时间,因此我只在某些区域执行此操作,因此我的表格如下所示:

reset 

set terminal qt

set title "Test"
unset key
set tic scale 0

set palette rgbformula 7,5,15
set cbrange [0:100]
set cblabel "Transmission"

set pm3d at s interpolate 1,1

unset surf

set xlabel "U_{Lense} [V]"
set ylabel "E_{Start} [eV]"

set datafile separator "\t"
splot "UT500test.csv" matrix rowheaders columnheaders

现在我也想在热图中显示此内容。但是每次我尝试这样做时,热图上的所有垃圾箱,无论相差1000或100的宽度是否相同。但我希望差异为100的宽度仅为1000差异的宽度的1/10。有可能这样做吗?

2 个答案:

答案 0 :(得分:3)

不需要使用stats的额外步骤。 您可以直接使用非均匀矩阵访问真实坐标:

  set offset 100,100,100,100
  plot $Data matrix nonuniform using 1:2:3 with points pt 5 lc palette

enter image description here

缺少的部分是填充整个区域,而不是绘制单个点。您可以使用pm3d做到这一点:

  set pm3d corners2color mean
  set view map
  splot $Data matrix nonuniform with pm3d

enter image description here 颜色与先前的图不匹配,因为pm3d在分配颜色时会考虑每个框的所有4个角。我告诉它取平均值(这是默认值),但许多其他变体也是可能的。您可以使用set pm3d interpolate 3,3

进一步平滑着色

答案 1 :(得分:1)

您可以使用绘图样式with boxxyerror进行某些操作。这非常简单,除了将x坐标放入数组中的方式之外,稍后将在绘制过程中使用它。也许有更聪明的解决方案。

代码:

### heatmap with irregular spacing
reset session
unset key 

$Data <<EOD
0.00    0.00    1000    2000    2100    2200    2300    2400    3000    4000
1000    0.75    0.75    0.43    0.34    0.61    0.74    0.66    0.97    0.58
1100    0.82    0.90    0.18    0.12    0.87    0.15    0.01    0.57    0.97
1200    0.10    0.15    0.68    0.73    0.55    0.07    0.98    0.89    0.01
1300    0.67    0.38    0.41    0.85    0.37    0.45    0.49    0.21    0.98
1400    0.76    0.53    0.68    0.09    0.22    0.40    0.59    0.33    0.08
2000    0.37    0.32    0.30    NaN     0.33    NaN     0.73    0.94    0.96
3000    0.07    0.61    0.37    0.54    0.32    0.28    0.62    0.51    0.48
4000    0.79    0.98    0.78    0.06    0.16    0.45    0.83    0.50    0.10
5000    0.49    0.95    0.29    0.59    0.55    0.88    0.29    0.47    0.93
EOD

stats $Data nooutput
BoxHalfWidth=50
# put first row into array
array ArrayX[STATS_columns]
set table $Dummy
    plot for [i=1:STATS_columns] $Data u (ArrayX[i]=column(i)) every ::0::0 with table
unset table

plot for [i=2:STATS_columns] $Data u (ArrayX[i]):1:(BoxHalfWidth):(BoxHalfWidth):i every ::1 with boxxyerror fs solid 1.0 palette
### end of code

结果:

enter image description here

编辑:

稍加努力,您还可以生成一个覆盖整个区域的图。 与@Ethan中的简单代码相反,矩形以数据点坐标为中心,并具有实际数据点z值的颜色。此外,还绘制了数据点(2200,2000)。矩形的边界在矩阵点之间。外部矩形的尺寸等于到下一个内部矩阵点的x和y距离。

代码:

### heatmap with irregular spacing with filled area
reset session
unset key 

$Data <<EOD
0.00    0.00    1000    2000    2100    2200    2300    2400    3000    4000
1000    0.75    0.75    0.43    0.34    0.61    0.74    0.66    0.97    0.58
1100    0.82    0.90    0.18    0.12    0.87    0.15    0.01    0.57    0.97
1200    0.10    0.15    0.68    0.73    0.55    0.07    0.98    0.89    0.01
1300    0.67    0.38    0.41    0.85    0.37    0.45    0.49    0.21    0.98
1400    0.76    0.53    0.68    0.09    0.22    0.40    0.59    0.33    0.08
2000    0.37    0.32    0.30    NaN     0.33    NaN     0.73    0.94    0.96
3000    0.07    0.61    0.37    0.54    0.32    0.28    0.62    0.51    0.48
4000    0.79    0.98    0.78    0.06    0.16    0.45    0.83    0.50    0.10
5000    0.49    0.95    0.29    0.59    0.55    0.88    0.29    0.47    0.93
EOD

stats $Data nooutput
ColCount = STATS_columns-1
RowCount = STATS_records-1
# put first row and column into arrays
array ArrX[ColCount]
array ArrY[RowCount]
set table $Dummy
    plot for [i=1:ColCount] $Data u (ArrX[i]=column(i+1)) every ::0::0 with table
    plot $Data u (ArrY[$0+1]=$1) every ::1 with table
unset table

dx(i) = (ArrX[i]-ArrX[i-1])*0.5
dy(i) = (ArrY[i]-ArrY[i-1])*0.5
ndx(i,j) = ArrX[i] - (i-1<1        ? dx(i+1) : dx(i))
pdx(i,j) = ArrX[i] + (i+1>ColCount ? dx(i)   : dx(i+1))
ndy(i,j) = ArrY[j] - (j-1<1        ? dy(j+1) : dy(j))
pdy(i,j) = ArrY[j] + (j+1>RowCount ? dy(j)   : dy(j+1))

set xrange[ndx(1,1):pdx(ColCount,1)]
set yrange[ndy(1,1):pdy(1,RowCount)]
set tic out
plot for [i=2:STATS_columns] $Data u (ArrX[i-1]):1:(ndx(i-1,$0)):(pdx(i-1,$0)): \
    (ndy(i-1,$0+1)):(pdy(i-1,$0+1)):i every ::1 with boxxyerror fs solid 1.0 palette
### end of code

结果:

enter image description here

Edit2: 只是为了好玩,这是gnuplot 5.0的“复古版本”:

gnuplot5.0不支持数组。尽管gnuplot5.0支持数据块,但显然像$Datablock[1]这样的索引不起作用。因此,解决方法是将矩阵X,Y坐标放入字符串CoordsXCoordsY中,并使用word()获得坐标。如果string和word()没有其他限制,则以下内容可与gnuplot5.0一起使用,并得到与上述相同的结果。

代码:

### heatmap with irregular spacing with filled area
# compatible with gnuplot 5.0
reset session
unset key 

$Data <<EOD
0.00    0.00    1000    2000    2100    2200    2300    2400    3000    4000
1000    0.75    0.75    0.43    0.34    0.61    0.74    0.66    0.97    0.58
1100    0.82    0.90    0.18    0.12    0.87    0.15    0.01    0.57    0.97
1200    0.10    0.15    0.68    0.73    0.55    0.07    0.98    0.89    0.01
1300    0.67    0.38    0.41    0.85    0.37    0.45    0.49    0.21    0.98
1400    0.76    0.53    0.68    0.09    0.22    0.40    0.59    0.33    0.08
2000    0.37    0.32    0.30    NaN     0.33    NaN     0.73    0.94    0.96
3000    0.07    0.61    0.37    0.54    0.32    0.28    0.62    0.51    0.48
4000    0.79    0.98    0.78    0.06    0.16    0.45    0.83    0.50    0.10
5000    0.49    0.95    0.29    0.59    0.55    0.88    0.29    0.47    0.93
EOD

stats $Data nooutput
ColCount = int(STATS_columns-1)
RowCount = int(STATS_records-1)
# put first row and column into arrays

CoordsX = ""
set table $Dummy
    set xrange[0:1]     # to avoid warnings
    do for [i=2:ColCount+1] {
        plot $Data u (Value=column(i)) every ::0::0 with table
        CoordsX = CoordsX.sprintf("%g",Value)." "
    }
unset table
CoordsY = ""
set table $Dummy
    do for [i=1:RowCount] {
        plot $Data u (Value=$1) every ::i::i with table
        CoordsY= CoordsY.sprintf("%g",Value)." "
    }
unset table

dx(i) = (word(CoordsX,i)-word(CoordsX,i-1))*0.5
dy(i) = (word(CoordsY,i)-word(CoordsY,i-1))*0.5
ndx(i,j) = word(CoordsX,i) - (i-1<1        ? dx(i+1) : dx(i))
pdx(i,j) = word(CoordsX,i) + (i+1>ColCount ? dx(i)   : dx(i+1))
ndy(i,j) = word(CoordsY,j) - (j-1<1        ? dy(j+1) : dy(j))
pdy(i,j) = word(CoordsY,j) + (j+1>RowCount ? dy(j)   : dy(j+1))

set xrange[ndx(1,1):pdx(ColCount,1)]
set yrange[ndy(1,1):pdy(1,RowCount)]
set tic out
plot for [i=2:ColCount+1] $Data u (real(word(CoordsX,i-1))):1:(ndx(i-1,int($0))):(pdx(i-1,int($0))): \
    (ndy(i-1,int($0+1))):(pdy(i-1,int($0+1))):i every ::1 with boxxyerror fs solid 1.0 palette
### end of code