Тепловая карта с разной шириной столбцов / линий - PullRequest
2 голосов
/ 08 мая 2019

Я что-то симулирую и хочу выяснить влияние двух параметров. Поэтому я изменяю их оба и ищу результат для каждой пары значений параметров и получаю результат как:

  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
....

Чтобы визуализировать их, я использую gnuplot, создавая тепловую карту, которая прекрасно работает, показывая мне цвета и высоту:

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

Теперь я хочу более подробно рассмотреть некоторые области моей тепловой карты и изменить мои параметры с шагом 100, а не 1000, как показано в таблице выше. Но поскольку моделирование занимает довольно много времени, я просто делаю это для некоторых областей, поэтому моя таблица выглядит следующим образом:

0  1000  2000  2100  2200  2300  2400 ...  2900  3000  4000  ...
...

Теперь я хочу показать это и в тепловой карте. Но каждый раз, когда я пытался это сделать, все ячейки на тепловой карте, независимо от того, имеют ли разность 1000 или 100, одинаковую ширину. Но я хочу, чтобы те, у кого разница в 100 составляла всего 1/10 ширины из 1000 разностей. Есть ли возможность сделать это?

Ответы [ 2 ]

3 голосов
/ 09 мая 2019

Дополнительные шаги с 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 голос
/ 08 мая 2019

Вы могли бы сделать что-нибудь со стилем печати 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

Edit:

Приложив немного больше усилий, вы также можете создать сюжет, который охватывает всю область. В отличие от более простого кода из @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 в строки CoordsX и CoordsY и получить координаты с помощью word(). Если нет другого ограничения для строки и 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
...